OpenMP声明了simd函数和指针/ ref参数

时间:2018-02-06 12:37:34

标签: c++ c openmp vectorization simd

我需要对C ++函数进行向量化,这会产生许多(比方说4个)结果。调用者在本地计算中使用这些结果。假设我使用simdlen(4)我需要16个double个数的小常量空间,或4个向量,每个有4个元素。我不想将这些数字存储在一个大的全局数组中。假设示例函数如下所示:

#pragma omp declare simd simdlen(4) linear(out:4)
void multifun(double v1, double v2, double *out)
{
  out[0] = (v1+v2)/2;
  out[1] = (v1-v2)/2;
  out[2] = (v1+v2)/3;
  out[3] = (v1-v2)/3;
}

问题:是否可以调用此向量化函数,out本地/静态变量?以下不起作用,即对multifun的调用未进行矢量化

#pragma omp declare simd simdlen(4)
double test1(double v1, double v2)
{
  double out[4];
  multifun(v1, v2, out);
  return out[0] + out[1] + out[2] + out[3];
}

这是合理的 - 我需要为out提供更多空间,并告诉编译器它可以在矢量化代码中使用它。我该怎么做?

使用大型通用数组是有效的,可以由调用者分配和传递,并用作临时工作空间,例如,

#pragma omp declare simd simdlen(4) linear(out:4)
double test2(double v1, double v2, *out)
{
  multifun(v1, v2, out);
  return out[0] + out[1] + out[2] + out[3];
}

但这正是我想要避免的:调用者不应该被实现的内部所困扰,并被迫提供(大)临时存储。

理想情况下,我想从类似于此的test1循环中调用simd

void test_multifun(int n, const double *v1, const double *v2, double * result)
{

// should vectorize call to test1 - how??
#pragma omp for simd
  for(int i=0; i<n; i++){
    result[i] = test1(v1[i], v2[i]);
  }
}

// this works, but requires O(n) temporary storage
#pragma omp for simd
  for(int i=0; i<n; i++){
    result[i] = test2(v1[i], v2[i], out+i*4);
  }
}

当前的OpenMP框架中是否有解决方案?

0 个答案:

没有答案