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

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

所以我尝试将其设置为“static”,但仍然没有任何改善。

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

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

编译器是 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 。如果这三个都不使用,则行为是实现定义的。例如,这可以是仅启动一个线程,或启动与机器上的“核心”一样多的线程,或其他...

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

关于c++ - OpenMP #pragma,只有一个线程在处理我的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33413712/

相关文章:

c++ - 有 c-tor 和 d-tor 会产生段错误,而没有它们则不会出现段错误

c# - 基于 bool 值的线程阻塞

c++ - next_permutation() 的并行代码

c++ - 使用 openMP 在 C++ 中进行内存分配和分配

c++ - 修改特征矩阵对角线

c++ - 父窗口重绘时子窗口消失

c++ - 指向类模板方法的 void 指针的 vector

android - 在后台线程中启动可运行的

c++ - 来自另一个线程的shared_from_this()(成员线程函数)

开发 C++ 上的 openmp