我需要对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框架中是否有解决方案?