我正在编写代码,我正在尝试根据提供给我的指南使用更多线程。它说:“并行是通过使用 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/