我在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/