当 omp num_threads(多于 1)和 parallel for 只有 1 个循环存在时会发生什么
what happens when omp num_threads (more than 1) and parallel for with only 1 loop is present
l_thread = 4;
max = 1; //4
#pragma omp parallel for num_threads(l_thread) private(i)
for(i=0;i<max;i++)
;//some operation
在这种情况下,omp 将创建 4 个线程。我想知道只循环 1 次的 for 循环(在这种情况下)是否只会被 4 个线程之一占用,对吗?而其他线程将处于空闲状态?在这种情况下,我看到 cpu 4 个线程的使用情况几乎相同。可能是什么原因?只有一个线程应该是高的,其他的必须是低的吧?
您对此的看法是正确的。如果 max=1
并且您有多个线程,则线程 0 将执行单循环迭代,其他线程将在并行区域的末尾等待线程 0 赶上。您看到 n-1 个其他线程导致系统负载的原因是因为它们 spin-wait 在区域的末尾,因为当线程必须唤醒并注意到并行工作时,这要快得多(或者在你的情况下:不是那么并行工作 :-)) 完成。
您可以通过 OMP_WAIT_POLICY
环境变量更改此行为。有关完整说明,请参阅 OpenMP specification。
l_thread = 4;
max = 1; //4
#pragma omp parallel for num_threads(l_thread) private(i)
for(i=0;i<max;i++)
;//some operation
在这种情况下,omp 将创建 4 个线程。我想知道只循环 1 次的 for 循环(在这种情况下)是否只会被 4 个线程之一占用,对吗?而其他线程将处于空闲状态?在这种情况下,我看到 cpu 4 个线程的使用情况几乎相同。可能是什么原因?只有一个线程应该是高的,其他的必须是低的吧?
您对此的看法是正确的。如果 max=1
并且您有多个线程,则线程 0 将执行单循环迭代,其他线程将在并行区域的末尾等待线程 0 赶上。您看到 n-1 个其他线程导致系统负载的原因是因为它们 spin-wait 在区域的末尾,因为当线程必须唤醒并注意到并行工作时,这要快得多(或者在你的情况下:不是那么并行工作 :-)) 完成。
您可以通过 OMP_WAIT_POLICY
环境变量更改此行为。有关完整说明,请参阅 OpenMP specification。