ランタイムのスレッド数の変更

環境変数を使用してランタイム時にスレッド数を変更することはできません。しかし、プログラムから 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 言語 *******
#include "omp.h"
#include "mkl.h"
#include <stdio.h>
#define SIZE 1000
void main(int args, char *argv[]){
	double *a, *b, *c;
	a = new double [SIZE*SIZE];
	b = new double [SIZE*SIZE];
	c = new 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]);
	}
	delete [] a;
	delete [] b;
	delete [] c;
	}
        

        
// ******* Fortran 言語 *******
		PROGRAM DGEMM_DIFF_THREADS
		INTEGER N, I, J
		PARAMETER (N=1000)
		REAL*8 A(N,N),B(N,N),C(N,N)
		REAL*8 ALPHA, BETA
		INTEGER*8 MKL_MALLOC
		integer ALLOC_SIZE
		integer NTHRS
		ALLOC_SIZE = 8*N*N
		A_PTR = MKL_MALLOC(ALLOC_SIZE,128)
		B_PTR = MKL_MALLOC(ALLOC_SIZE,128)
		C_PTR = MKL_MALLOC(ALLOC_SIZE,128)
		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
        

このヘルプトピックについてのフィードバックを送信

© 2006 - 2010 Intel Corporation. 無断での引用、転載を禁じます。