c++ - 在 C++ 中使用 OpenACC 并行化和矢量化迭代 Karatsuba 算法

标签 c++ parallel-processing vectorization openacc karatsuba

我正在尝试使用 C++ 中的 OpenACC 并行化 Karatsuba 算法的迭代版本。我想问一下如何矢量化内部 for 循环。我的编译器显示了关于该循环的消息:

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;

关于c++ - 在 C++ 中使用 OpenACC 并行化和矢量化迭代 Karatsuba 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49817402/

相关文章:

c++ - 无法从端口 2368 (Linux) C 接收 UDP 流

vectorization - 如何理解icc编译器优化报告中的加速比?

c++ - 为什么我在 MSVS2019/C++ 中获取不到 char 或 uint8_t 变量的内存地址?

c++ - write 返回较小尺寸时该怎么办?

python - Python 中更复杂的并行 for 循环

c# - 在我的 asp.net mvc web 应用程序中使用 Parallel.Foreach 和 WebClient() 有什么缺点或风险吗

python - NumPy 中的多轴均值

c - 我怎样才能让 clang 向量化一个简单的循环?

c++ - 如何实现具有 2 个键的哈希表?

java - 并行对两个数组的每个元素求和