インテル® マス・カーネル・ライブラリー 11.2 ユーザーズガイド
環境変数を使用してランタイム時にスレッド数を変更することはできません。しかし、プログラムから OpenMP* API 関数を呼び出してランタイム時にスレッドの数を変更することはできます。以下のサンプルコードでは、omp_set_num_threads() ルーチンを使用してランタイム時にスレッドの数を変更しています。 「スレッド数を設定する手法」も参照してください。
以下のサンプルは、C と Fortran コードの両方を示しています。C 言語でこのサンプルを実行するには、インテル® コンパイラー・パッケージの omp.h ヘッダーファイルを使用します。 インテル® コンパイラーがない場合、C バージョンではなく omp_set_num_threads() に Fortran API を使用してください。 例: omp_set_num_threads_( &i_one );
// ******* C language ******* #include "omp.h" #include "mkl.h" #include <stdio.h> #define SIZE 1000 int main(int args, char *argv[]){ double *a, *b, *c; a = (double*)malloc(sizeof(double)*SIZE*SIZE); b = (double*)malloc(sizeof(double)*SIZE*SIZE); c = (double*)malloc(sizeof(double)*SIZE*SIZE); double alpha=1, beta=1; int m=SIZE, n=SIZE, k=SIZE, lda=SIZE, ldb=SIZE, ldc=SIZE, i=0, j=0; char transa='n', transb='n'; for( i=0; i<SIZE; i++){ for( j=0; j<SIZE; j++){ a[i*SIZE+j]= (double)(i+j); b[i*SIZE+j]= (double)(i*j); c[i*SIZE+j]= (double)0; } } cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc); printf("row\ta\tc\n"); for ( i=0;i<10;i++){ printf("%d:\t%f\t%f\n", i, a[i*SIZE], c[i*SIZE]); } omp_set_num_threads(1); for( i=0; i<SIZE; i++){ for( j=0; j<SIZE; j++){ a[i*SIZE+j]= (double)(i+j); b[i*SIZE+j]= (double)(i*j); c[i*SIZE+j]= (double)0; } } cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc); printf("row\ta\tc\n"); for ( i=0;i<10;i++){ printf("%d:\t%f\t%f\n", i, a[i*SIZE], c[i*SIZE]); } omp_set_num_threads(2); for( i=0; i<SIZE; i++){ for( j=0; j<SIZE; j++){ a[i*SIZE+j]= (double)(i+j); b[i*SIZE+j]= (double)(i*j); c[i*SIZE+j]= (double)0; } } cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc); printf("row\ta\tc\n"); for ( i=0;i<10;i++){ printf("%d:\t%f\t%f\n", i, a[i*SIZE], c[i*SIZE]); } free (a); free (b); free (c); return 0; }
// ******* Fortran language ******* PROGRAM DGEMM_DIFF_THREADS INTEGER N, I, J PARAMETER (N=100) REAL*8 A(N,N),B(N,N),C(N,N) REAL*8 ALPHA, BETA ALPHA = 1.1 BETA = -1.2 DO I=1,N DO J=1,N A(I,J) = I+J B(I,J) = I*j C(I,J) = 0.0 END DO END DO CALL DGEMM('N','N',N,N,N,ALPHA,A,N,B,N,BETA,C,N) print *,'Row A C' DO i=1,10 write(*,'(I4,F20.8,F20.8)') I, A(1,I),C(1,I) END DO CALL OMP_SET_NUM_THREADS(1); DO I=1,N DO J=1,N A(I,J) = I+J B(I,J) = I*j C(I,J) = 0.0 END DO END DO CALL DGEMM('N','N',N,N,N,ALPHA,A,N,B,N,BETA,C,N) print *,'Row A C' DO i=1,10 write(*,'(I4,F20.8,F20.8)') I, A(1,I),C(1,I) END DO CALL OMP_SET_NUM_THREADS(2); DO I=1,N DO J=1,N A(I,J) = I+J B(I,J) = I*j C(I,J) = 0.0 END DO END DO CALL DGEMM('N','N',N,N,N,ALPHA,A,N,B,N,BETA,C,N) print *,'Row A C' DO i=1,10 write(*,'(I4,F20.8,F20.8)') I, A(1,I),C(1,I) END DO STOP END