0

我有两个功能:

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 中的适当指针。我需要帮助

4

1 回答 1

0

1-是的。-D T=short在编译时直接使用或浮动是安全的。因为它将生成 2 个适当的内核。

2- OpenCL(和其他带有指针的编程语言)理解您传递的指针具有类型。他们在寻址内存时坚持这种类型。至少在 C 中,这不是问题,因为不允许自动指针转换。如果指针不匹配,程序员会得到一个错误。

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

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

于 2013-09-21T09:07:27.967 回答