【发布时间】:2021-06-08 12:13:40
【问题描述】:
首先,这个问题可能会有点误导,我了解并行区域中的折叠子句与没有区域的区域之间的主要区别。假设我要转置一个矩阵,有以下两种方法,第一种是与SIMD 指令并行用于内部循环,第二种方法使用collapse(2) 子句
#pragma omp parallel for
for(int i=0; i<rows; i++){
#pragma omp simd
for(int j=0; j<columns; j++){
*(output + j * rows + i) = *(input + i * columns + j);
}
}
#pragma omp parallel for collapse(2)
for(int i=0; i<rows; i++){
for(int j=0; j<columns; j++){
*(output + j * rows + i) = *(input + i * columns + j);
}
在上述两种方法中,尤其是在缓存方面,哪种方法更有效?
在上述两个中,哪个实现会更高效、更快?有什么方法可以通过查看实现来确定。
鉴于所有循环计数器都是相互独立的,是否可以设置一个关于何时使用的基本准则?
TIA
【问题讨论】:
-
与您的问题无关,但对于编码风格,大多数人更喜欢
output[j * rows + i] -
大声笑,是的,我实际上认为它首先移动到内存位置,然后取消引用它
-
你的意思是像
(output + j*rows)[i]?如果这就是你想要的语义,那我就是用 C 写的。或者如果你的意思是偏移到最终的内存位置,然后是 deref,x[y]是 C 中的语法糖,不多也不少.
标签: parallel-processing openmp vectorization simd