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

时间:2015-10-29 12:03:07

标签: c++ multithreading openmp pragma

我正在编写代码,我正在尝试根据我提供的指南使用更多线程。它说:"使用OpenMP #pragma实现并行化,以动态地将图像行分配到不同的线程,每个处理器或核心都有一个线程。"这里是代码:

#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 用于定义如何在线程之间划分循环的迭代。所以&#34;动态&#34;当循环迭代被分成时使用,其大小由我决定。因为在这行代码中,大小设置为&#34; 1&#34;我试图将其更改为更大的数字,但结果并没有改变,仍然只使用了1个线程。

所以我试着将它设置为&#34;静态&#34;相反,但仍然没有改善。

我试过&#34; AUTO&#34;选项,以这种方式,调度会话将由编译器决定..仍然没有解决方案。

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

编译器是cl.exe ..我正在使用Visual Studio 2013。 有没有办法增加线程数?

1 个答案:

答案 0 :(得分:1)

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

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

这些的相对优先级由标准定义,并且几乎归结为num_threads()优先于omp_set_num_threads(),优先于OMP_NUM_THREADS。如果三者都没有使用,则行为是实现定义。例如,这可以是仅启动一个线程,或者启动与核心一样多的线程&#39;在机器上,或其他东西......

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