インテル® MKL 11.3 ユーザーズガイド
環境変数を使用してランタイム時に OpenMP* スレッド数を変更することはできません。しかし、OpenMP* ルーチンを呼び出して変更することはできます。例えば、以下のサンプルコードでは、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