2013-09-21 87 views
0

我有两个功能:OpenCL内核参数歧义

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]; 
} 

是它安全地从编译选项上面介绍的功能调用这个通用内核-DT = short和-DT = float分别?我是否需要使用对齐方式,还是OpenCL自动将内核参数与本例中的内核参数对齐到2和4字节?

通常,当我将cl_mem对象传递给内核时OpenCL不知道存储在此cl_mem对象中的数据类型,我可以理解OpenCL如何将cl_mem对象转换为内核arg中的适当指针。需要帮助

回答

0

1-是的。直接使用-D T=short或在编译时浮动是安全的。因为它会生成2个适当的内核。 2-OpenCL(和其他带指针的编程语言)明白你传递的指针是一个类型。在寻址内存时他们坚持这种类型。 至少在C中,这不是一个问题,因为不允许使用自动指针转换。如果指针不匹配,程序员会得到一个错误。

但是在OpenCL中,缓冲区的内存区域被认为是泛型或无效指针。当您将它们分配给内核时,该转换隐含在该分配中。但这并不意味着它是正确的!

例如。如果你创建一个浮点缓冲区,用浮点数填充它,用它作为短内核的参数。结果将是错误的,因为内核会解释错误的缓冲区。但是,如果通过将短阵列传递给浮点内核来做错误,结果将是SEG_FAULT。

+0

谢谢,但对齐是什么?程序员是否需要调整内核参数?或者当我们需要使用对齐时存在这种情况吗? – sandye51

+0

只要不侵犯对像*(((char *)指针)+1)'这样的元素的访问权限,就不需要对齐任何数组或结构。但是,如果对齐,某些结构可能会更好。顺便说一句,如果你只是使用单个元素的数组,就没有任何对齐。 – DarkZeros