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