OpenMP #pragma,只有一个线程在处理我的代码
OpenMP #pragma, only one thread working on my code
我正在编写代码,我正在尝试根据提供给我的指南使用更多线程。它说:"Parallelism is achieved using an OpenMP #pragma to dynamically allocate rows of the image to different threads, with a thread for each processor or core." 它在代码中:
#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 用于定义循环的迭代如何在线程之间划分。所以 "dynamic" 当循环迭代被分成 chunks 时使用,其大小由我决定。由于在这行代码中,大小设置为“1”,我试图将其更改为更大的数字,但结果没有改变,仍然只使用了 1 个线程。
所以我尝试将其设置为 "static" 但仍然没有改善。
我尝试了 "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
。如果这三个都不使用,则行为是实现定义的。例如,这可以是仅启动一个线程,或启动与机器上 'cores' 一样多的线程,或其他...
也就是说,您确定在编译器级别启用了 OpenMP 支持吗?
我正在编写代码,我正在尝试根据提供给我的指南使用更多线程。它说:"Parallelism is achieved using an OpenMP #pragma to dynamically allocate rows of the image to different threads, with a thread for each processor or core." 它在代码中:
#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 用于定义循环的迭代如何在线程之间划分。所以 "dynamic" 当循环迭代被分成 chunks 时使用,其大小由我决定。由于在这行代码中,大小设置为“1”,我试图将其更改为更大的数字,但结果没有改变,仍然只使用了 1 个线程。
所以我尝试将其设置为 "static" 但仍然没有改善。
我尝试了 "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
。如果这三个都不使用,则行为是实现定义的。例如,这可以是仅启动一个线程,或启动与机器上 'cores' 一样多的线程,或其他...
也就是说,您确定在编译器级别启用了 OpenMP 支持吗?