gpt4 book ai didi

c++ - Parellize 一些在 openmp c++​​ 中嵌套的

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:23 32 4
gpt4 key购买 nike

我的矩阵和内核卷积的串行代码是这样工作的:

int index1, index2, a, b;
for(int x=0;x<rows;++x){
for(int y=0;y<columns;++y){
for(int i=0;i<krows;++i){
for(int j=0;j<kcolumns;++j){
a=x+i-krows/2;
b=y+j-kcolumns/2;
if(a<0)
index1=rows+a;
else if(a>rows-1)
index1=a-rows;
else
index1=a;

if(b<0)
index2=columns+b;
else if(b>columns-1)
index2=b-columns;
else
index2=b;

output[x*columns+y]+=input[index1*columns+index2]*kernel[i*kcolumns+j];

}
}

}
}

卷积考虑了对边界的循环处理。现在我想用 openmp 并行化代码。我考虑过将前两个 for 循环减少为一个并使用语法:

#pragma omp parallel
#pragma omp for private(x,y,a, b, index1, index2)
for(int z=0;z<rows*columns;z++){
x=z/columns;
y=z%columns;
...

我看到这样的并行化减少了 cpu 时间,但我不是 openmp 的大专家,所以我问自己是否有其他更有效的解决方案。我认为将其他 2 个嵌套 for 循环也并行化不是一个好主意。使用尺寸为 1000*10000 的输入矩阵和方核矩阵 9*9 我获得了这些时间:

1 个线程 4823 毫秒

2 个线程 2696 毫秒

4 个线程 2513 毫秒。

希望有人能给我一些有用的建议。 for reduction 语法呢?

最佳答案

我的建议是完全改变方法。如果您对边界使用循环处理(即您的问题是周期性的),那么快速的方法是基于基于 fft 的频谱方法:

-傅立叶变换矩阵和内核-计算产品-逆傅里叶变换乘积(你有卷积)

这 (1) 效率高得多(除非内核的维度比矩阵的维度小得多)和 (2) 您可以使用支持多线程的 fft 库(如 FFTW)并让它处理它.

关于c++ - Parellize 一些在 openmp c++​​ 中嵌套的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23835816/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com