如何将int4数组复制到int8向量中

问题描述 投票:1回答:1

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);
c++ kernel buffer opencl
1个回答
0
投票

您有2个选项:

  1. 投射指针
  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]);
© www.soinside.com 2019 - 2024. All rights reserved.