我正在编写代码,我正在尝试根据我提供的指南使用更多线程。它说:"使用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 用于定义如何在线程之间划分循环的迭代。所以&#34;动态&#34;当循环迭代被分成块时使用,其大小由我决定。因为在这行代码中,大小设置为&#34; 1&#34;我试图将其更改为更大的数字,但结果并没有改变,仍然只使用了1个线程。
所以我试着将它设置为&#34;静态&#34;相反,但仍然没有改善。
我试过&#34; AUTO&#34;选项,以这种方式,调度会话将由编译器决定..仍然没有解决方案。
我还发现 private(r)意味着变量 r 对每个线程都是私有的而不是共享但实际上并没有改变最终结果
编译器是cl.exe ..我正在使用Visual Studio 2013。 有没有办法增加线程数?
答案 0 :(得分:1)
在OpenMP中,有几种方法可以定义在并行区域中使用的线程数:
OMP_NUM_THREADS
。要使用它,请在运行之前在代码的环境中进行设置。omp_set_num_threads()
。要使用它,请在到达并行区域之前调用它。num_threads()
编译器指令的parallel
子句。这些的相对优先级由标准定义,并且几乎归结为num_threads()
优先于omp_set_num_threads()
,优先于OMP_NUM_THREADS
。如果三者都没有使用,则行为是实现定义。例如,这可以是仅启动一个线程,或者启动与核心一样多的线程&#39;在机器上,或其他东西......
那就是说,您确定在编译器级别启用了OpenMP支持吗?