所以我目前正在传递2个GPULevel,我希望内核能够获取每个GPULevel,然后如果在levels
中有arr1
的数组,我想检查值是否为> = 0,如果它改变了值。
我的原始代码内核代码是:
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循环时,我得到了一个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