OpenCL内核赢得';如果数组成员的索引是由函数或表达式计算的,则不编译

OpenCL内核赢得';如果数组成员的索引是由函数或表达式计算的,则不编译,opencl,Opencl,我正在使用OpenCL和OpenGL编写一个N体(galaxy)模拟器。在OpenCL内核代码中,数组成员的索引由如下函数计算:array[indx(i,j)]。内核在集成Intel图形卡上编译正常,但在专用NVidia图形卡上编译失败。clBuildProgram()返回错误代码-11,但生成日志为空,尽管据报告日志字符串长度为16个字符。可能是NVidia驱动程序中的错误?我试着在第三块集成英特尔图形卡上运行代码,结果显示“操作无效”,同时返回-11错误代码。为什么内核在一张卡上编译,但在另

我正在使用OpenCL和OpenGL编写一个N体(galaxy)模拟器。在OpenCL内核代码中,数组成员的索引由如下函数计算:
array[indx(i,j)]
。内核在集成Intel图形卡上编译正常,但在专用NVidia图形卡上编译失败。clBuildProgram()返回错误代码-11,但生成日志为空,尽管据报告日志字符串长度为16个字符。可能是NVidia驱动程序中的错误?我试着在第三块集成英特尔图形卡上运行代码,结果显示“操作无效”,同时返回-11错误代码。为什么内核在一张卡上编译,但在另外两张卡上编译失败

我曾尝试删除
indx()
函数,并将
数组[indx(I,j)]
替换为
数组[(j*(j-1)/2+I)]
。它仍然不能在其他两张卡片上编译

unsigned long long indx(unsigned long long i, unsigned long long j)
{
    return (j * (j - 1) / 2 + i);
}

kernel void propagate(global float4* pos, global float4* vel, global float* acc_matr)
{
    constant float mass = 0.00009f;

    for (unsigned long long j = i + 1; j < get_global_size(0); j++)
    {
        float r = distance(pos[i], pos[j]);

        if (r > 0.05f)
        {
            acc_matr[indx(i, j)] = mass / r / r / r;
        }
        else
        {
            acc_matr[indx(i, j)] = -0.5f;
        }
    }
}
unsigned long long indx(unsigned long i,unsigned long j)
{
返回(j*(j-1)/2+i);
}
内核无效传播(全局浮点4*pos、全局浮点4*vel、全局浮点*acc_matr)
{
恒定浮子质量=0.00009f;
for(无符号长j=i+1;j0.05f)
{
acc_matr[indx(i,j)]=质量/r/r;
}
其他的
{
acc_matr[indx(i,j)]=-0.5f;
}
}
}

变量
i
未在
propagate
内核函数中声明。这是复制粘贴错误吗?如果是,请提供缺失的代码。此外,您是否尝试过在
if(r>0.05f)之前执行索引计算
并将结果放入一个临时变量中?只需在每个数组索引之前添加一个错误检查,例如如果indx>=0,那么它应该接受它。如果它是一个矩阵,那么为什么它不作为宽度x j+i进行索引?变量
i
未在
传播
内核函数中声明。这是复制粘贴错误吗?如果是,请提供缺失的代码。另外,您是否尝试过在
if(r>0.05f)
之前执行索引计算,并将结果放入临时变量中?只需在每个数组索引之前添加一个错误检查,例如如果indx>=0,那么它应该接受它如果它是一个矩阵,那么为什么它不作为宽度x j+i进行索引?