c++ - 在 OpenCL 中使用自己的 Vector 类型似乎更快

标签 c++ c opencl gpgpu vectorization

我在OpenCL中看到了一个smallpt实现,作者在内核中使用了他自己的 vector 类型和预处理器宏函数。

typedef struct { float x, y, z; } Vec;

#define vinit(v, a, b, c) { (v).x = a; (v).y = b; (v).z = c; }
#define vsmul(v, a, b) { float k = (a); vinit(v, k * (b).x, k * (b).y, k * (b).z) }
#define vdot(a, b) ((a).x * (b).x + (a).y * (b).y + (a).z * (b).z)
#define vnorm(v) { float l = 1.f / sqrt(vdot(v, v)); vsmul(v, l, v); }
and much more...

我测试了代码,并将用户定义的 vector 类型和操作替换为标准内置 float3 类型。令我惊讶的是,作者最初的实现比内置 float3 的变体快了 10 帧。之后我用Intel OpenCL Applications Kernel Builder测试了一下情况,似乎证实内置函数速度较慢。

有什么想法吗?供应商推荐内置 vector 类型:/

最佳答案

用户定义的 vector 是真正的 3 元素 vector ,使用 3 个 float 的大小。 但是,OpenCL float3 vector 实际上使用 float4 vector ,如 cl_platform.h 中所示:

/* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */
typedef  cl_float4  cl_float3;

最初使用 vector 是 OpenCL 推荐的编程技术。由于与普通非 vector 代码相比,充分利用了 SIMD 架构。

但随着 OpenCL 编译器的发展,现在编译器已经足够聪明,可以在内部对用户代码进行矢量化。 有时(我也见过其他内核,甚至是我自己的内核)最好用普通元素编写代码并让编译器重新向量化它,而不是使用默认 vector 类型。因此,我建议除非 vector 可以简化编程任务并且更易于阅读(例如 2D 处理等),否则现在不要使用 OpenCL vector 。

可能用户定义的vector3使用了更少的寄存器,并且溢出也更少。或者另一种 vector 排列对于算法来说可能更好,并且编译器可以自由地在用户定义的 vector 情况下 reshape 代码。

必须使用已编译的 PTX 代码对正在发生的情况进行深入分析。

关于c++ - 在 OpenCL 中使用自己的 Vector 类型似乎更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20200203/

相关文章:

c - 尝试创建一个猜测我的字母代码。如何合并用户输入的字符等于我的字母的情况?

c++ - 线程opencl编译

c++ - QTableView拖放行无法正常工作

c++ - 如果 vector 包含用户定义的对象,则在 vector 的存储重新分配中应调用什么

c++ - 柠檬图库 C++ - 有向图

c - 退出 main 时出现段错误

c++ - 查看是否处理了鼠标单击

c - 将动态 vector 从 C 返回到 R

opencl - OpenCL 工作项是否并行执行?

OpenCL 内置函数 'select'