gpt4 book ai didi

c++ - 英特尔 OpenCL 编译器 : optimize struct usage

转载 作者:太空狗 更新时间:2023-10-29 23:12:40 28 4
gpt4 key购买 nike

我有一个关于在 Intel 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 内存,然后从本地拷贝开始工作来掩盖低效访问模式。

关于c++ - 英特尔 OpenCL 编译器 : optimize struct usage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44342945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com