Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在openmp中并行化两个独立的for循环?_C++_Multithreading_Loops_Parallel Processing_Openmp - Fatal编程技术网

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]