my array1的大小为8,但是在内核中它声明为int4,我如何将其内容复制到向量int8 v ?任何帮助将不胜感激。
下面是我的内核.cl
__kernel void A2T1( __global int4 *a1,
__global int *a2,
__global int *out ) {
int8 v;
int8 v1;
int8 v2;
int8 results;
int8 mask;
v = vload8(0, a1);
v1 = vload8(0, a2);
v2 = vload8(1, a2);
mask.s01234567 = v.s01234567 > 15;
results = select(v2, v1, mask);
vstore8(v, 0, out);
vstore8(v1, 1, out);
vstore8(v2, 2, out);
vstore8(results, 3, out);
}
这是我在主/主机中声明数组和缓冲区的方式。
// declare data and memory objects
int array1[8];
int array2[16];
int output[32];
cl::Buffer arraybuffer1, arraybuffer2, outputbuffer;
// create buffers
arraybuffer1 = cl::Buffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(cl_int) * 8, &array1[0]);
arraybuffer2 = cl::Buffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(cl_int) * 16, &array2[0]);
outputbuffer = cl::Buffer(context, CL_MEM_READ_WRITE, sizeof(cl_int) * 32);
// set kernel arguments
kernel.setArg(0, arraybuffer1);
kernel.setArg(1, arraybuffer2);
kernel.setArg(2, outputbuffer);
// enqueue kernel for execution
queue.enqueueTask(kernel);
您有2个选项:
将int4*
投射到int*
应该是安全的-OpenCL在指针转换方面比标准C更轻松;主要危险是对准。确保int4
的对齐比int
严格,因此我们处于安全起见。
所以代码看起来像这样:
v = vload8(0, (global int*)a1);
OpenCL中的向量类型具有特殊的文字语法。 (请参见specification中的6.1.6,向量文字部分),您可以将2个int4
值合并为一个int8
:
v = (int8)(a1[0], a1[1]);