首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openMP:从并行区调用并行函数

openMP:从并行区调用并行函数
EN

Stack Overflow用户
提问于 2019-06-17 00:01:05
回答 1查看 272关注 0票数 0

我正在尝试让我的串行程序与openMP并行。下面的代码中,我有一个很大的并行区域,里面有许多内部的“#杂注omp for”部分。在串行版本中,我有一个函数fftw_shift(),里面也有"for“循环。

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

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

代码语言:javascript
复制
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);
 ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-17 00:56:21

如果你从一个parallel区域调用fftw_shift -而不是一个工作共享结构(即不是在parallel for中),那么你可以像在一个并行区域中一样使用omp for。这被称为孤立指令。

但是,您的循环只是复制数据,所以不要指望根据您的系统实现完美的加速。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56620484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档