Intel OpenCL编译器:优化结构使用情况

Intel OpenCL Compiler: optimize struct usage

本文关键字:用情 情况 结构 优化 OpenCL 编译器 Intel      更新时间:2023-10-16

我有一个问题,即在英特尔CPU上的opencl中使用结构。我当前的内核使用以下方式使用结构访问两个缓冲区:

struct pair {
    float first;
    float second;
};
inline const float f(const struct pair param) {
    return param.first * param.second;
}
inline const struct pair access_func(__global float const * const a, __global float const * const b, const int i) {
    struct pair res = {
            a[i],
            b[i]
    };
    return res;
}
// slow
__kernel ...(__global float const * const a, __global float const * const b)
{
 // ...
 x = f( access_func( a, b, i ) );
 // ...
}

当我以以下方式更改内核时,它运行的速度要快得多:

// fast
__kernel ...(__global float const * const a, __global float const * const b)
{
 // ...
 x = a[i] * b[ i ];
 // ...
}

有没有办法让英特尔编译器进行此优化?NVIDIA编译器似乎能够做到这一点,因为我在GPU上看不到运行时的差异。

预先感谢!

编译器无法在数据的内存布局上执行优化,考虑到openCL设备和主机之间的缓冲区和/或OpenCL设备上的多个内核之间共享了缓冲区;最有效的布局将取决于内核中的访问模式,并且每个内核显然可以不同。

您需要明智地选择数据的内存布局;这是GPU编程中最难的部分之一。请参阅针对您目标的每个实现的OPENCL优化指南,以找出他们喜欢的内容。有时,可以通过从global内存到local内存,然后从本地副本进行工作来掩盖效率低下的访问模式。

相关文章: