OpenMP #pragma,只有一个线程在处理我的代码

OpenMP #pragma, only one thread working on my code

我正在编写代码,我正在尝试根据提供给我的指南使用更多线程。它说:"Parallelism is achieved using an OpenMP #pragma to dynamically allocate rows of the image to different threads, with a thread for each processor or core." 它在代码中:

#pragma omp parallel for schedule(dynamic, 1) // OpenMP

for (int y = 0; y<height; y++){                       // Loop over image rows
    fprintf(stderr, "\rRendering (%d spp) %5.2f%%", samps, 100.*y / (height - 1));
    for (unsigned short x = 0, rng[3] = { 0, 0, y*y*y }; x<width; x++) {  // Loop cols
    ...

我试过根据这个改变工作线程数..

我一直在看手册,试图找到解决办法。我发现 schedule 用于定义循环的迭代如何在线程之间划分。所以 "dynamic" 当循环迭代被分成 chunks 时使用,其大小由我决定。由于在这行代码中,大小设置为“1”,我试图将其更改为更大的数字,但结果没有改变,仍然只使用了 1 个线程。

所以我尝试将其设置为 "static" 但仍然没有改善。

我尝试了 "AUTO" 选项,这样调度会话将由编译器决定。仍然没有解决方案。

我还发现 private(r) 意味着变量 r 对每个线程都是私有的而不是共享的,但实际上不会改变最终结果。

编译器是cl.exe..我用的是Visual Studio 2013。 有什么方法可以增加线程数?

在 OpenMP 中,有几种方法可以定义并行区域中使用的线程数:

  • 主要是环境变量OMP_NUM_THREADS。要使用它,请在 运行 之前在代码环境中设置它。
  • 函数omp_set_num_threads()。要使用它,请在到达平行区域之前调用它。
  • parallel 编译器指令的 num_threads() 子句。

它们的相对优先级由标准定义,几乎可以归结为 num_threads() 优先于 omp_set_num_threads(),后者优先于 OMP_NUM_THREADS。如果这三个都不使用,则行为是实现定义的。例如,这可以是仅启动一个线程,或启动与机器上 'cores' 一样多的线程,或其他...

也就是说,您确定在编译器级别启用了 OpenMP 支持吗?