【发布时间】:2012-02-14 13:12:21
【问题描述】:
我有简单的内核:
__kernel vecadd(__global const float *A,
__global const float *B,
__global float *C)
{
int idx = get_global_id(0);
C[idx] = A[idx] + B[idx];
}
为什么当我将 float 更改为 float4 时,内核运行速度会慢 30% 以上?
所有教程都说,使用向量类型可以加快计算速度...
在主机端,为 float4 参数分配的内存为 16 字节对齐,clEnqueueNDRangeKernel 的 global_work_size 小 4 倍。
内核在 AMD HD5770 GPU、AMD-APP-SDK-v2.6 上运行。
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 的设备信息返回 4。
编辑:
global_work_size = 1024*1024(及更大)
local_work_size = 256
使用 CL_PROFILING_COMMAND_START 和 CL_PROFILING_COMMAND_END 测量的时间。
对于较小的 global_work_size(float 为 8196 / float4 为 2048),矢量化版本更快,但我想知道,为什么?
【问题讨论】:
-
全局工作大小和工作组大小的值是多少?您测量的时间是什么?如何测量?
-
全局工作大小 = 1024*1024 本地工作大小 = 256,我使用 CL_PROFILING_COMMAND_START 和 CL_PROFILING_COMMAND_END 测量 clEnquueNDRangeKernel 的时间。对于较小的 global_work_size(float 为 8196 / float4 为 2048),矢量化版本更快,但我想知道,为什么?
-
较小和较大的工作大小之间的差异可能是由于您的恒定缓存。所以 2 个问题:1)如果你删除了 const,它是否仍然更快小而慢? 2)如果你介于两者之间,比如浮点数为 65536,浮点数为 16384,那么会发生什么?