【问题标题】:OpenMP #pragma, only one thread working on my codeOpenMP #pragma,只有一个线程处理我的代码
【发布时间】:2015-10-29 20:27:44
【问题描述】:

我正在编写代码,并且正在尝试根据我提供的指南使用更多线程。它说:“并行性是使用 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 用于定义循环的迭代如何在线程之间划分。因此,当循环迭代被分成 chunks 时使用“动态”,其大小由我决定。由于在这行代码中,大小设置为“1”,我尝试将其更改为更大的数字,但结果没有改变,仍然只使用了 1 个线程。

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

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

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

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

【问题讨论】:

  • 是的,如何在 Visual Studio 中启用 OpenMP。在命令行中添加/openmp或者点击项目配置中的开关。

标签: c++ multithreading openmp pragma


【解决方案1】:

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

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

这些的相对优先级由标准定义,几乎可以归结为num_threads() 优先于omp_set_num_threads(),后者优先于OMP_NUM_THREADS。如果这三个都没有使用,那么行为就是实现定义。例如,这可以是只启动一个线程,或者启动与机器上的“核心”一样多的线程,或者其他什么......

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

【讨论】:

  • @Tarta,什么解决了你的问题?
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多