其实我有两个问题,第一个是考虑缓存,下面哪一个代码更快?
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个核心,有没有更好的方法(更多缓存友好)呢?
谢谢! 鲍勃
答案 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/