gpt4 book ai didi

c++ - openMP:从并行区域调用并行函数

转载 作者:行者123 更新时间:2023-11-28 04:16:04 25 4
gpt4 key购买 nike

我正在尝试使我的串行程序与 openMP 并行。这是我有一个大的并行区域的代码,其中有许多内部“#pragma omp for”部分。在串行版本中,我有一个 fftw_shift() 函数,它内部也有“for”循环。

问题是如何正确重写 fftw_shift() 函数,以便外部并行区域中已经存在的线程可以在没有嵌套线程的情况下在内部拆分“for”循环。

我不确定我的实现是否正确。有一种方法可以在并行区域中内联整个函数,但我正在尝试了解如何在所描述的情况下处理它。

int fftw_shift(fftw_complex *pulse, fftw_complex *shift_buf, int 
array_size)
{
int j = 0; //counter
if ((pulse != nullptr) || (shift_buf != nullptr)){
if (omp_in_parallel()) {

//shift the array
#pragma omp for private(j) //shedule(dynamic)
for (j = 0; j < array_size / 2; j++) {
//left to right
shift_buf[(array_size / 2) + j][REAL] = pulse[j][REAL]; //real
shift_buf[(array_size / 2) + j][IMAG] = pulse[j][IMAG]; //imaginary

//right to left
shift_buf[j][REAL] = pulse[(array_size / 2) + j][REAL]; //real
shift_buf[j][IMAG] = pulse[(array_size / 2) + j][IMAG]; //imaginary
}
//rewrite the array
#pragma omp for private(j) //shedule(dynamic)
for (j = 0; j < array_size; j++) {
pulse[j][REAL] = shift_buf[j][REAL]; //real
pulse[j][IMAG] = shift_buf[j][IMAG]; //imaginary
}

return 0;
}
}

....
#pragma omp parallel firstprivate(x, phase) if(array_size >=
OMP_THREASHOLD)
{
// First half-step
#pragma omp for schedule(dynamic)
for (x = 0; x < array_size; x++) {
..
}

// Forward FTW
fftw_shift(pulse_x, shift_buf, array_size);
#pragma omp master
{
fftw_execute(dft);
}
#pragma omp barrier
fftw_shift(pulse_kx, shift_buf, array_size);
...
}

最佳答案

如果您从 parallel 区域调用 fftw_shift - 但不是工作共享结构(即不在 parallel for 中),则你可以只使用 omp for 就好像你在平行区域内一样。这称为孤立指令。

但是,您的循环只是复制数据,因此不要指望根据您的系统获得完美的加速。

关于c++ - openMP:从并行区域调用并行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56620484/

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