第一篇文章!
主要编辑..
我有这个用于计算点积的程序,使用带有-fopenmp的gcc编译。问题是,它没有创建我告诉它创建的线程数。在一台计算机上,它将不断产生2个线程,在另一台计算机上。这些数字都不是给它们的数字。我正在使用(静态,chunksize)调度,这是一种间接的方式,可以通过更改chunksize来选择我想要创建的线程数。我觉得运行时中有一些东西覆盖了我的指令,因为所有的计算机都使用相同的可执行文件。我还注意到,如果我给程序一个等于总负载的chunksize,它将使用一个线程但仍然产生与之前相同数量的线程。我做错了什么?
#pragma omp parallel shared(vector1, vector2, loadsize, vectorsize, final_sum) private(i, threadsum, threadid)
{
threadsum = 0;
threadid = omp_get_thread_num();
#pragma omp for schedule(static, loadsize)
for (i = 0; i < vectorsize; i++){
threadsum += vector1[i] * vector2[i];}
printf("thread %d reached up to index %d with a sum of %d\n", threadid, (i-1), threadsum);
#pragma omp critical
final_sum += threadsum;
}
printf("final sum: %d", final_sum);
谢谢,
扎克
答案 0 :(得分:1)
据我所知,chunksize表示线程要执行的工作量。它永远不会控制线程的产生。从代码中可以看出,调用
时会产生线程#pragma omp parallel
不是在你调用时
#pragma omp for schedule(static, loadsize)
静态和动态调度用于确定在编译时或运行时分配给线程的工作量。所以,不要将调度与线程数混淆。
如果您需要控制线程数,请使用
omp_set_num_threads()
答案 1 :(得分:0)
OpenMP有一个称为动态线程数的功能。运行时可以自由决定并行块是否可以用比OMP_NUM_THREADS
指定的更少的线程执行。某些运行时默认启用它,如果是,则可以通过以下方式之一禁用它:
OMP_DYNAMIC
环境变量的值设置为FALSE
; omp_set_dynamic(0)
; num_treads(#threads)
子句显式指定给定并行区域中的线程数。 omp_set_num_threads()
以及环境变量OMP_NUM_THREADS
的值设置将使用的线程数的上限,但实际数量仍可能小于动态线程的数量启用。默认值OMP_NUM_THREADS
取决于实现:它等于GCC和英特尔编译器的逻辑CPU数量,等于最新Oracle Studio编译器的2
。