OpenMP #pragma,只有一个线程在我的代码上工作

OpenMP #pragma, only one thread working on my code

本文关键字:我的 代码 工作 线程 #pragma 有一个 OpenMP      更新时间:2023-10-16

我正在处理代码,我正在尝试根据提供的指南使用更多线程。它说:"并行性是使用 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
    ...

我试图根据这个改变工作线程的数量。

我一直在看手册,试图找到解决方案。我发现调度用于定义循环迭代如何在线程之间分配。因此,当循环迭代被分成大小由我决定的块时,使用"动态"。由于在这一行代码中,大小设置为"1",我试图将其更改为更大的数字,但结果没有改变,仍然只使用了 1 个线程。

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

我尝试了"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。如果这三者中均未使用,则行为是实现定义的。例如,这可以是只启动一个线程,或者启动与机器上的"核心"一样多的线程,或者其他什么......

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

相关文章: