2012-06-07 52 views
0

第一篇文章!openmp创建随机数的线程

主要编辑..

我有了这个程序计算的点积,使用gcc与-fopenmp编译。问题是,它没有创建我告诉它创建的线程数。在一台计算机上,它会不断产生2个线程,在另一台计算机上。这两个数字都不是赋予它们的数字。我正在使用(静态,块大小)调度,这是一种间接方式,可以通过更改块大小来选择要创建的线程数。我觉得运行时有些东西会覆盖我的指令,因为所有的计算机都使用相同的可执行文件。我也注意到,如果我给程序一个与总负载相等的块大小,它将使用一个线程,但仍然产生与之前相同的线程数。我究竟做错了什么?

#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);  

感谢,

扎克

回答

1

据我所知,CHUNKSIZE表示到线程执行的工作量。它从不控制线程的产生。你可以从你的代码中看到,该线程催生当你调用

#pragma omp parallel 

不是当你调用

#pragma omp for schedule(static, loadsize) 

静态和动态调度时,用来确定分配给线程的工作量,无论是在编译时间还是运行时间。所以,不要将调度与线程数混淆。

如果你需要控制线程的数量,使用

omp_set_num_threads() 
+0

谢谢,它似乎对它创建的线程数有一个默认限制。我用omp_get_max_threads()检查了它们,发现我仅限于2个线程。 – zedjay72

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和Intel编译器的逻辑CPU数量,等于最新的Oracle Studio编译器的2