2017-04-02 80 views
0

让我们假设我们有这样的代码:核心在嵌套循环中是否在OpenMP中分区?

for(size_t i=0; i<5; i++){ 
    //do something expensive here 
    for(size_t i=0; i<5; i++){ 
    //do somehting expensive here too 
    } 
} 

让我们假设我们有至少25个物理内核。我们如何利用所有这些? A collapse将是不可能的,因为第一个昂贵的计算。在这种情况下,最有效的解决方案是什么?

+0

当int确定工作时使用size_t是没有意义的。不确定你的问题,或者你对mop_nested有什么异议。 – tim18

回答

0

只解耦环路。如果您当前的代码是

#pragma omp parallel for 
for(int i = 0; i < 5; ++i) 
{ 
    expensive_1(i); 
    for(int j = 0; j < 5; ++j) 
    { 
    expensive_2(j); 
    } 
} 

然后使它成这样,可能节省的expensive_1的结果,如果需要,他们在expensive_2

#pragma omp parallel for 
for(int i = 0; i < 5; ++i) 
{ 
    expensive_1(i); 
} 

#pragma omp parallel for collapse(2) 
for(int i = 0; i < 5; ++i) 
{ 
    for(int j = 0; j < 5; ++j) 
    { 
    expensive_2(j); 
    } 
} 
+1

当然,你想在第二个平行的崩溃(2)? –