0

第一篇文章!

主要编辑..

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

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

谢谢,

扎克

4

2 回答 2

1

据我所知,块大小代表线程要执行的工作量。它从不控制线程的产生。正如您从代码中看到的那样,线程是在您调用时产生的

#pragma omp parallel

不是当你调用

#pragma omp for schedule(static, loadsize)

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

如果需要控制线程数,请使用

omp_set_num_threads()
于 2012-06-07T04:44:21.763 回答
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 数量,并且等于2最新的 Oracle Studio 编译器。

于 2012-06-08T09:11:53.710 回答