0

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

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 个核心,有没有更好的方法(更友好的缓存)来做到这一点?

谢谢!鲍勃

4

1 回答 1

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]++;
    }

Lawrence Livermore National Laboratory 提供了一个很棒的 OpenMP 教程。你可以在那里找到更多信息。 https://computing.llnl.gov/tutorials/openMP/

于 2013-10-12T01:16:52.803 回答