【发布时间】:2011-05-19 10:29:48
【问题描述】:
这似乎有点开放式,但我在为多个处理器和缓存优化一段 C++ 代码时遇到了麻烦。
比多处理器更重要的是缓存:我正在迭代 2 个嵌套循环
for(int i=0; i<n; i++){
//do a little something here with a single array
for(int j=0; j<whoaAnotherArray[n].size(); j++){
* access array[i][j] and otherArray[i][j] and store in a variable
- an example is: "int x = array[i][j] + otherArray[i][j]"
* compare variable to some other array[index calculated from i and j]
- an example is: "if (x < yetAnotherArray[i*n+j]){ //do something to yetAnotherArray }"
}
}
我的数组(数组和其他数组)的大小非常大。 n 是它们的大小。
有没有办法让缓存更友好?我已经从使用链表切换了,这对缓存来说很糟糕。我在某处读到我的访问顺序 [i][j] 也是缓存高效的。
FWIW,这是负权循环检测算法的一部分。
我在想也许是因为我的数组太大了(顺便说一句,它们是整数数组),最好将它们分解一下以便它们更好地放入缓存中?但我不确定这是否正确,或者是否正确,如何去做。
我也开始使用 openmp。我一直在做的唯一一件事就是添加
#pragma omp parallel for
在正确的 for 循环之前,我得到了不错的利用。我想学习如何更好地使用并行性,但除了代码中的 for 循环之外,我不确定我能做什么。并且一直:我正在尝试对缓存友好。
【问题讨论】:
-
你到底想在这里实现什么?我很确定有比 O(N²) 更有效的解决方案。
-
通常是一个好的编译器(尤其是当你明确要求他这样做时)在循环中插入 precache 指令。
-
@elusive 抱歉,不是 O(N^2) 而是 O(N),因为我的内部循环不是 N。我会解决这个问题...@ruslik 我正在使用 g++,如何我应该这样做吗?
-
@ruslik:我一直认为编译器是女性。
-
@Akusete:当英语不是母语时会发生这种情况:)
标签: c++ caching optimization openmp