C和OpenMP中的嵌套循环优化

时间:2013-10-11 23:49:55

标签: c optimization openmp

其实我有两个问题,第一个是考虑缓存,下面哪一个代码更快?

int a[10000][10000];
for(int i = 0; i < 10000; i++){
    for(int j = 0; j < 10000; j++){
       a[i][j]++;
    }
}

int a[10000][10000];
for(int i = 0; i < 10000; i++){
    for(int j = 0; j < 10000; j++){
       a[j][i]++;
    }
}

我猜第一个会更快,因为缓存未命中的次数要少得多。我的问题是,如果您使用OpenMP,您将使用什么样的技术来优化这样的嵌套循环?我的策略是将外部循环划分为4个块并将它们分配给4个核心,有没有更好的方法(更多缓存友好)呢?

谢谢! 鲍勃

1 个答案:

答案 0 :(得分:2)

正如maxihatop指出的那样,第一个表现更好,因为它具有更好的缓存局部性。

在这种情况下将外部循环划分为块是一个很好的策略,其中循环内任务的复杂性是不变的。

您可能需要查看#pragma omp for schedule(static)。这将在线程之间连续均匀地划分迭代。所以你的代码应该是这样的:

#pragma omp for schedule(static)
for (i = 0; i < 10000; i++) {
    for(j = 0; j < 10000; j++){
        a[i][j]++;
    }
劳伦斯利弗莫尔国家实验室提供了一个很棒的OpenMP教程。你可以在那里找到更多信息。 https://computing.llnl.gov/tutorials/openMP/