For loop 由于for循环,OpenCL丢失了变量的值

For loop 由于for循环,OpenCL丢失了变量的值,for-loop,opencl,For Loop,Opencl,我有以下opencl代码: __constant SomeConstants[] = { 5, 7, 242, 74 }; long aslong(__global int * arr, int offset) { return ... <CalculateLong> ...; }; void calcSomething(__global int * numArray, int * result) { long tempArray[] = { numArray[0

我有以下opencl代码:

__constant SomeConstants[] = { 5, 7, 242, 74 };

long aslong(__global int * arr, int offset) {
    return ... <CalculateLong> ...;
};

void calcSomething(__global int * numArray, int * result) {
    long tempArray[] = { numArray[0], numArray[1], numArray[2], numArray[3] };

    long x0 = (result[0] = aslong(numArray, 0)) + tempArray[0];
    long x1 = (result[1] = aslong(numArray, 8)) + tempArray[1];
    long x2 = (result[2] = aslong(numArray, 16)) + tempArray[2];
    long x3 = (result[3] = aslong(numArray, 32)) + tempArray[3];
    // do some calculations here
    result[0] = x0;
    result[1] = x1;
    result[2] = x2;
    result[3] = x3;

};

__kernel void calc(__global int * numArray, __global long * sum) {
    long arr[] = { SomeConstants[0], SomeConstants[1], SomeConstants[2], SomeConstants[3] };
    calcSomething(numArray, arr);
    sum[get_global_id(0)] = arr[0];
    sum[get_global_id(0)+1] = arr[1];
    sum[get_global_id(0)+2] = arr[2];
    sum[get_global_id(0)+3] = arr[3];
};
uu常量SomeConstants[]={5,7,242,74};
尽可能长(uu全局整数*arr,整数偏移){
返回。。。;
};
无效计算结果(uu全局int*numArray,int*result){
长tempArray[]={numArray[0],numArray[1],numArray[2],numArray[3]};
长x0=(结果[0]=aslong(numArray,0))+tempArray[0];
long x1=(结果[1]=aslong(numArray,8))+tempArray[1];
长x2=(结果[2]=aslong(numArray,16))+tempArray[2];
长x3=(结果[3]=aslong(numArray,32))+tempArray[3];
//在这里做一些计算
结果[0]=x0;
结果[1]=x1;
结果[2]=x2;
结果[3]=x3;
};
__内核无效计算(uuu全局int*numArray,uuu全局long*sum){
长arr[]={SomeConstants[0],SomeConstants[1],SomeConstants[2],SomeConstants[3]};
计算方法(努马拉伊,arr);
sum[get_global_id(0)]=arr[0];
sum[get_global_id(0)+1]=arr[1];
sum[get_global_id(0)+2]=arr[2];
sum[get_global_id(0)+3]=arr[3];
};
上面的代码按预期工作,但问题是,我无法向calcSomething添加更多的计算。当我向calcSomethig添加一个空循环时,如下所示:

void calcSomething(__global int * numArray, int * result) {
    long tempArray[] = { numArray[0], numArray[1], numArray[2], numArray[3] };

    long x0 = (result[0] = aslong(numArray, 0)) + tempArray[0];
    long x1 = (result[1] = aslong(numArray, 8)) + tempArray[1];
    long x2 = (result[2] = aslong(numArray, 16)) + tempArray[2];
    long x3 = (result[3] = aslong(numArray, 32)) + tempArray[3];

    for (int i = 0; i < 18; i++) {}

    result[0] = x0;
    result[1] = x1;
    result[2] = x2;
    result[3] = x3;

};
void calcSomething(\u全局int*numArray,int*result){
长tempArray[]={numArray[0],numArray[1],numArray[2],numArray[3]};
长x0=(结果[0]=aslong(numArray,0))+tempArray[0];
long x1=(结果[1]=aslong(numArray,8))+tempArray[1];
长x2=(结果[2]=aslong(numArray,16))+tempArray[2];
长x3=(结果[3]=aslong(numArray,32))+tempArray[3];
对于(int i=0;i<18;i++){
结果[0]=x0;
结果[1]=x1;
结果[2]=x2;
结果[3]=x3;
};

结果[0]和结果[1]存储了正确的值,但结果[2]和结果[3]绝对错误。通过注释for循环,结果[2]和3是正确的。。。调用for循环时,知道x0、x1、x2和x3发生了什么吗?

编辑回答:您的问题在于操作:

sum[get_global_id(0)] = arr[0];
sum[get_global_id(0)+1] = arr[1];
sum[get_global_id(0)+2] = arr[2];
sum[get_global_id(0)+3] = arr[3];
您正在使用带有重叠索引的
sum[]
全局数组。但是,许多工作项将写入相同的内存,产生未定义的结果。 您需要修复重叠,或者对全局变量执行原子操作

例如:

 gid 0 -> Write to sum[0,1,2,3]
 gid 1 -> Write to sum[1,2,3,4]
 //....
for
循环根本与问题无关。您只是看到了多线程环境中不同调度的效果。但这并不是问题的根源

进一步编辑: 该代码存在与OpenCL无关的问题。上面已经描述了OpenCL的唯一问题


在很多地方,C变量被错误地处理或隐式转换,然后被错误地使用。例如,在
aslong()
8个连续的整数被添加到一个long中,但是long是由8字节组成的,而不是8整数。

你的意思是,我必须使用get\u global\u id(0)而不是使用绝对索引访问数组?我的结果数组未定义为_全局。我正在calc内核中创建结果数组…Sry,答案是有效的,但变量是错误的。让我编辑它。好的,谢谢,但我只有一个工作项(用于测试目的)。这就是绝对索引的原因。。。同样值得注意的是,在没有循环的情况下,结果总是正确的。当我添加for循环时,最后两个结果总是错误的(但总是有相同的值)。嗯,你确定只运行一个工作项吗?您的全局数组是否有足够的空间容纳4个长值?是的。。。内核中的全局和数组有8个长值的空间(用于测试目的)。编辑:\\n当我尝试用while循环替换for循环时,也会出现相同的问题。。。