gpt4 book ai didi

c++ - OpenMP #pragma,只有一个线程在处理我的代码

转载 作者:行者123 更新时间:2023-11-28 06:00:25 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com