C++ 如何在openmp中并行化两个独立的for循环?
我有以下循环设置:C++ 如何在openmp中并行化两个独立的for循环?,c++,multithreading,loops,parallel-processing,openmp,C++,Multithreading,Loops,Parallel Processing,Openmp,我有以下循环设置: for( int k = 0 ; k < N ; j++ ) { while( 1 ) { for( int i = 0 ; i < N ; i++ ) { int sum = 0; for( int j = nums[i] ; j < nums[i+1] ; j++ ) { sum = sum + num
for( int k = 0 ; k < N ; j++ )
{
while( 1 )
{
for( int i = 0 ; i < N ; i++ )
{
int sum = 0;
for( int j = nums[i] ; j < nums[i+1] ; j++ )
{
sum = sum + nums[i];
}
}
if( sum == some_desired_value )
break;
}
}
for(int k=0;k
我想使用openmp并行化这段代码。
N是一个非常大的整数。由于外部k循环与i循环中发生的事情非常独立,因此我计划在k和j循环中使用并行for,如下所示。但是我知道这不是一个正确的设置,因为迭代次数已经在k循环中分配给每个线程,因此,每个k循环迭代只有一个线程,内部I循环不可能分配线程迭代
#pragma omp parallel for
for( int k = 0 ; k < N ; j++ )
{
while( 1 )
{
#pragma omp parallel for
for( int i = 0 ; i < N ; i++ )
{
int sum = 0;
for( int j = nums[i] ; j < nums[i+1] ; j++ )
{
sum = sum + nums[i];
}
}
if( sum == some_desired_value )
break;
}
}
#pragma omp parallel for
对于(int k=0;k
我想知道是否有某种方法可以实现上述设置
PS:嵌套循环可能很方便,但我不确定是否可以在此设置中使用它们?只要N远大于可供您使用的物理cpu内核数,就不应该同时并行内部循环。用并行术语来说,可以说外循环提供了足够的并行性,因此,在最好的情况下,尝试并行化内循环会由于线程创建而增加更多的开销,在最坏的情况下,会导致系统超额订阅
只有当N的数量级与内核的数量级相同时,您才应该开始考虑进一步并行化该循环嵌套,在这种情况下,这可能远远不是小事。您的示例是不完整的。我想您可以使用
if(nums[I]而不是内部for循环。无论如何,内部for循环很难并行化,因为每次计算都需要独占访问sum
。在类似的代码中,最好有一个和数组,每个迭代都存储它的值,这样它们可以并行运行,然后合并所有结果。这是否回答了您的问题?非常感谢您的回复。是的,我故意省略了一些代码,因为它与我的问题不太相关。不,我不能通过if(nums[I]