Changing the Number of Threads at Run Time

You cannot change the number of threads during run time using environment variables. However, you can call OpenMP API functions from your program to change the number of threads during run time. The following sample code shows how to change the number of threads during run time using the omp_set_num_threads() routine. See also Techniques to Set the Number of Threads.

The following example shows both C and Fortran code examples. To run this example in the C language, use the omp.h header file from the Intel(R) compiler package. If you do not have the Intel compiler but wish to explore the functionality in the example, use Fortran API for omp_set_num_threads() rather than the C version. For example, omp_set_num_threads_( &i_one );

// ******* C language *******
#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 language *******
		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
        

Submit feedback on this help topic

Copyright © 2006 - 2010, Intel Corporation. All rights reserved.