openmp创建随机数的线程

时间:2012-06-07 03:33:40

标签: multithreading gcc openmp

第一篇文章!

主要编辑..

我有这个用于计算点积的程序,使用带有-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);     

谢谢,

扎克

2 个答案:

答案 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