所以我目前传递2 GPULevel的,我想内核采取其中每一个,然后如果在该阵列levels
有arr1
我想检查值是否> = 0,如果它是改变价值。OpenCL for循环给出CL_OUT_OF_RESOURCES
我origonal代码内核代码是这样的:
typedef struct GPULevelDef
{
int nInput, nOutput;
float arr1[100];
float arr2[100];
}GPULevel;
__kernel void levelComposition(__global GPULevel *lLevels, __global GPULevel *oLevels, __global int *LCount)
{
int lIndex = get_global_id(1);
int wIndex = get_global_id(0);
int wCount = 0;
if(lIndex < LCount)
{
wCount = lLevels[lIndex].nInput*lLevels[lIndex].nOutput;
if(wIndex < wCount)
{
if(lLevels[lIndex].arr1[wIndex] >= 0)
{
oLevels[lIndex].arr1[wIndex] = (lLevels[lIndex].arr1[wIndex]) + 350;
}
}
}
}
然而,它会给我真的很奇怪的结果作为第一个返回GPULevel返回的结果是正确的,第二个将只有nInput返回正确的值其余的将是错误的。
这就是我真正想在内核方面做的事情,但是当我添加一个for循环时,即使我为了实验原因添加一个for循环,我也会返回一个CL_OUT_OF_RESOURCES。
期望中的内核:
typedef struct GPULevelDef
{
int nInput, nOutput;
float arr1[100];
float arr2[100];
}GPULevel;
__kernel void levelComposition(__global GPULevel *lLevels, __global GPULevel *oLevels, __global int *lCount)
{
for(int lIndex = get_global_id(0); lIndex < lCount; lIndex++)
{
int wCount = lLevels[lIndex].nInput*lLevels[lIndex].nOutput;
for(int wIndex = get_global_id(0); wIndex < wCount; wIndex++)
{
if(lLevels[lIndex].arr1[wIndex] >= 0)
{
oLevels[lIndex].arr1[wIndex] = (lLevels[lIndex].arr1[wIndex]) + 350;
}
}
}
}
以下是重要的主机代码:
GPULevel* levelIn = (GPULevel*)malloc(sizeof(GPULevel)*levelCount);
GPULevel* levelOut = (GPULevel*)malloc(sizeof(GPULevel)*levelCount);
size_t dataSize = sizeof(GPULevel)*levelCount;
layerBuffer = clCreateBuffer(gpu.context,CL_MEM_READ_ONLY,dataSize,NULL,&err);
err = clEnqueueWriteBuffer(queue,layerBuffer,CL_TRUE,0,dataSize,(void*)layerIn,0,NULL,NULL);
cl_mem bufferB = clCreateBuffer(gpu.context,CL_MEM_WRITE_ONLY,dataSize,NULL,&err);
err = clEnqueueWriteBuffer(queue,bufferB,CL_TRUE,0,dataSize,(void*)layerOut,0,NULL,NULL);
GPULayer* val1 = (GPULevel*)calloc(sizeof(levelIn), sizeof(GPULevel));
GPULayer* val2 = (GPULevel*)calloc(sizeof(levelOut), sizeof(GPULevel));
err = clEnqueueReadBuffer(queue, layerBuffer, CL_TRUE, 0, dataSize, val1, 0, NULL, NULL);
err = clEnqueueReadBuffer(queue, bufferB, CL_TRUE, 0, dataSize, val2, 0, NULL, NULL);
因此,要总结:我已经使用了第一个内核,因为我认为这会给我的结果,我因为我的印象是它是一个并行的实施。我觉得奇怪的是get_global_id()对于lIndex需要是1,对于wIndex来说需要为0才能使它正常工作(否则它会再次产生错误的结果)。因此,当这个原始的内核在第二级上连上时,我创建了第二个内核。 在这第二个内核中,它正是我想要实现的内容,但由于某些原因导入了for循环会导致CL_OUT_OF_RESOURCES错误(-5)。我需要知道我应该使用哪个内核,并与坚忍,以及如何得到我想要
感谢
不知道这图以及帮助
levels[0]
nInput = 2
nOutput = 5
arr1 [0] = 2
arr1 [1] = 7
arr1 [...] = -32
arr1 [n] = -1
arr2 [0] = 3
arr2 [1] = -2
arr2 [...] = 5
arr2 [n] = -3
levels[1]
nInput = 5
nOutput = 1
arr1 [0] = 3
arr1 [1] = 7
arr1 [...] = 72
arr1 [n] = -1
arr2 [0] = 5
arr2 [1] = -2
arr2 [...] = 1
arr2 [n] = -1
Parallel Parallel
------->oLevels[0].arr1[0] =lLevels[0].arr1[0] +350
lLevels[0] ------->oLevels[0].arr1[1] =lLevels[0].arr1[1] +350
------->oLevels[0].arr1[...] NOTHING
------->oLevels[0].arr1[n] NOTHING
------->oLevels[1].arr1[0] =lLevels[0].arr1[0] +350
lLevels[1] ------->oLevels[1].arr1[1] =lLevels[0].arr1[1] +350
------->oLevels[1].arr1[...] =lLevels[0].arr1[...] +350
------->oLevels[1].arr1[n] NOTHING
我从构建日志没有输出,也没有错误 – bubblebath
您使用NVIDIA GPU吗?我经常看到NVIDIA OpenCL驱动程序报告的CL_OUT_OF_RESOURCES错误超出了本地内存的访问范围。 – Dade916