OpenCL vstoren不在标量数组中存储向量

OpenCL vstoren不在标量数组中存储向量,opencl,Opencl,我的内核如下。 我的问题是为什么vstore8不工作?在主机代码中打印输出时,它只返回0。 我在代码中放了一个“if(all(v==0)==1)”来检查错误是否是在我将v中的值从int4*复制到int8时引起的,但事实并非如此。 看来vstoren什么也没做。 我是OpenCL的新手,非常感谢您的帮助 __kernel void select_vec(__global int4 *input1, __global int *input2,

我的内核如下。 我的问题是为什么vstore8不工作?在主机代码中打印输出时,它只返回0。 我在代码中放了一个“if(all(v==0)==1)”来检查错误是否是在我将v中的值从int4*复制到int8时引起的,但事实并非如此。 看来vstoren什么也没做。 我是OpenCL的新手,非常感谢您的帮助

__kernel void select_vec(__global int4 *input1,
                        __global int *input2,
                        __global int *output){

    //copy values in input arrays to vectors
    int i = get_global_id(0);
    int4 vA = input1[i];
    int4 vB = input1[i+1];
    __private int8 v = (int8)(vA.s0, vA.s1, vA.s2, vA.s3, vB.s0, vB.s1, vB.s2, vB.s3);
    __private int8 v1 = vload8(0, input2);
    __private int8 v2 = vload8(1, input2);
    int8 results;
    
    if(any(v > 10) == 1){
        //if there is any of the elements in v that are greater than 10
        // copy the corresponding elements from v1 for elements greater than 10
        // for elements less than or equal to 17, copy the corresponding elements from v2
        results = select(v1, v2, v > 10);
    }else{
        //results is the combination of the first half of v2 and v2
        results = (int8) (v1.lo, v2.lo);
    }
    
    /* for testing of the error is due to vstoren */
    // results = (int8) (1);
    
    //store results in output array
    vstore8(results, i, output);
}

你是说
int8v1=vload8(i+0,input2)
int8v2=vload8(i+1,input2)
vstore8(结果,i,输出)


当前,您从
input2
中读取相同的内存地址(0-7表示
v1
,8-15表示
v2
),并使用所有线程写入
output
(0-7)中的相同内存地址。这是一种竞争条件,因为根据
v
和写入
输出的最后一个线程,您可以随机获得不同的结果。但是如果
input2
在地址0-15中以
0s
开头,并且
output
以所有
0s
初始化,它将保持所有
0s

嗨,抱歉,我在测试某些内容时忘记更改它们。我修复了它,但它仍然不起作用。在使用vstoren之前,我还尝试将results=(int8)(1)放在内核的末尾,但它不会打印1。您是否在内核调用之后和检查结果之前,对
输出
队列.finish()执行
enqueueReadBuffer