【问题标题】:Is there a way to unroll loops in an AMD OpenCL kernel with the compiler?有没有办法使用编译器在 AMD OpenCL 内核中展开循环?
【发布时间】:2012-11-07 19:46:03
【问题描述】:

我正在尝试评估用于 AMD 和 Nvidia GPU 的 OpenCL 之间的性能差异。我有一个执行矩阵向量乘法的内核。我现在在两个不同的系统上运行内核,我的笔记本电脑有一个带有 Ubuntu 12.04 和 CUDA 4.0(包含 OpenCL 库和头文件)的 NVidia GT525m,另一个是带有 AMD Radeon HD7970 的台式机,再次带有 Ubuntu 12.04 和最新的 Catalyst 驱动程序。

在内核中,我有两个 #pragma unroll 语句,它们为 Nvidia OpenCL 实现(~6x)产生了很大的加速。然而,AMD OpenCL 版本不会产生任何加速。使用 AMD APP 内核分析器查看内核会出现未使用展开的错误,因为行程计数未知。 所以我的问题是,#pragma unroll 是否与 AMD OpenCL 一起工作,或者是否有替代方案(也许是我不知道的编译器标志)。我在下面包含了内核

__kernel void mvKernel(__global float* a, const __global float* x, __global float* y, int m, int n)
{
    float sum = 0.0f;
    __global float* A;
    int i;
    int j = 0;
    int indx = get_global_id(0);
    __local float xs[12000];
#pragma unroll 
    for(i = get_local_id(0); i < n; i+= get_local_size(0)) {
        xs[i] = x[i];
    } 
    barrier(CLK_LOCAL_MEM_FENCE);
    A = &a[indx];
#pragma unroll 256
    for(i = 0; i < n; i++) {
        sum += xs[i] * A[j];
        j += m;
    }
    y[indx] = sum;
}

相同的内核在两种实现中都产生了正确的结果,但是 #pragma unroll 命令对 AMD 没有任何作用(通过将它们注释掉来检查)。

【问题讨论】:

    标签: compiler-construction opencl pragma loop-unrolling amd-processor


    【解决方案1】:

    它没有被记录,但它实际上应该与#pragma unroll 一起使用。您可以检查编译器日志以查看是否应用了展开?我不确定内核分析器是否使用与 OpenCL 运行时相同的编译器,您可能需要检查一下。

    否则,如果您知道n 以 256 个块为单位,您可以手动展开,方法是在 256 个元素的块上循环一个循环,另一个循环在内部,固定大小为 256,这可能更容易展开。这样肯定能解决行程数静态不知道的问题。

    但是,请记住,展开循环通常并不是什么大的胜利,因为您没有很多寄存器来缓存您的计算。循环展开增加的套准压力可能会导致套准溢出,这甚至更慢。您应该检查内核在 AMD 卡上的实际运行速度。较新的 NVIDIA OpenCL 编译器也可能不再从 unroll pragma 中受益。

    【讨论】:

    • 我目前无法访问 AMD 机器,但据我所知,无论是否展开,内核在 AMD 卡上花费了大约 3.7 毫秒,而 Nvidia 大约需要 0.7 ms 与 unroll,~1.17ms 没有 unroll 和 2.88 ms,如果我使用标志'-cl-opt-disable' 编译内核,它会关闭所有编译器优化,所以看起来很多加速实际上并没有到来从展开。明天我会查看编译器日志,看看它给出了什么。
    • 正在应用展开,我想我只需要更好地针对 AMD 架构优化我的代码
    • 循环展开会导致代码大小膨胀,从而导致 i-cache 未命中。但它会如何导致套准压力增加呢?我没有遵循。我的意思是寄存器的活动范围不会改变,因为循环已展开。我猜如果稍后的编译器优化通过执行一些与活动区域重叠的代码运动,那么同时活动的寄存器数量可能会增加。你是这个意思吗?但你会认为编译器会在执行代码运动时跟踪这一点以避免溢出。
    • 它可以展开,然后尝试向前移动负载,这会增加套准压力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2023-03-20
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多