我有两个功能:
void sum1(short * a, short * b, short * res, int size);
void sum2(float * a, float * b, float * res, int size);
我有一个通用内核
__kernel void sum(__global const T * a, __global const T * b, __global T * res, int size)
{
int x = get_global_id(0);
if (x < size) res[x] = a[x] + b[x];
}
是否可以安全地从上面介绍的函数调用这个泛型内核,编译选项-D T = short和-D T = float?我是否需要使用对齐或OpenCL是否自动将内核参数在这种情况下分别对齐为2和4个字节?
通常,当我将cl_mem对象传递给内核时,OpenCL不知道存储在此cl_mem对象中的数据类型,我可以理解OpenCL如何将cl_mem对象“转换”为内核arg中的相应指针。我需要帮助那个
答案 0 :(得分:0)
1-是的。在编译时直接使用-D T=short
或浮动是安全的。因为它会生成2个适当的内核。
2- OpenCL(和其他带指针的编程语言)理解你传递的指针有一个类型。在解决记忆时,他们坚持这种类型。 至少在C中,这不是问题,因为不允许自动指针转换。如果指针不匹配,程序员会收到错误。
但是在OpenCL中,缓冲区的内存区域被认为是通用或无效指针。将它们分配给内核时,转换隐含在赋值中。但这并不意味着它是正确的!
例如。如果您创建一个浮动缓冲区,请使用浮点数填充它,将其用作短内核的参数。结果将是错误的,因为内核将错误地解释缓冲区。但是,如果通过将一个短数组传递给浮点内核来做错,结果将是一个SEG_FAULT。