迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
Iterative Karatsuba algorithm parallelized and vectorized using OpenACC in C++
我正在尝试在C++中使用OpenACC并行化Karatsuba算法的迭代版本。我想问一下如何矢量化内部for loop
.我的编译器向我显示了有关该循环的以下消息:
526, Complex loop carried dependence of result-> prevents parallelization
Loop carried dependence of result-> prevents parallelization
Loop carried backward dependence of result-> prevents vectorization
这里是两个嵌套循环的代码:
#pragma acc kernels num_gangs(1024) num_workers(32) copy (result[0:2*size-1]) copyin(A[0:size],$
{
#pragma acc loop gang
for (TYPE position = 1; position < 2 * (size - 1); position++) {
// for even coefficient add Di/2
if (position % 2 == 0)
result[position] += D[position / 2];
TYPE start = (position >= size) ? (position % size ) + 1 : 0;
TYPE end = (position + 1) / 2;
// inner loop: sum (Dst) - sum (Ds + Dt) where s+t=i
#pragma acc loop worker
for(TYPE inner = start; inner < end; inner++){
result[position] += (A[inner] + A[position - inner]) * (B[inner] + B[position - inn$
result[position] -= (D[inner] + D[position - inner]);
}
}
}
实际上,我不确定是否可以对其进行矢量化。但如果是这样,我就无法意识到我做错了什么。谢谢
"复杂循环携带结果的依赖性"问题是由于指针混叠造成的。 编译器无法判断"result"指向的对象是否与其他指针的对象之一重叠。
作为C++扩展,您可以将 C99 "restrict" 关键字添加到数组的声明中。 这将向编译器断言指针不会别名。
或者,您可以在循环指令上添加 OpenACC "独立"子句,以告知编译器循环没有任何依赖项。
请注意,OpenACC 不支持数组缩减,因此除非您修改代码以使用标量,否则您将无法并行化"内部"循环。 像这样:
rtmp = result[position];
#pragma acc loop vector reduction(+:rtmp)
for(TYPE inner = start; inner < end; inner++){
rtmp += (A[inner] + A[position - inner]) * (B[inner] + B[position - inn$
rtmp -= (D[inner] + D[position - inner]);
}
result[position] = rtmp;
相关文章:
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如何使用 Pthreads 并行化图像翻转?
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- 如何在 OpenACC 中并行化内部具有"min"功能的循环
- 我可以使用OpenACC来并行化调用某些函数的大代码吗