gpt4 book ai didi

neural-network - 这个 OpenCL 内核如何导致错误 CL_INVALID_COMMAND_QUEUE

转载 作者:行者123 更新时间:2023-12-04 05:51:20 27 4
gpt4 key购买 nike

我在实现前馈多层感知器时遇到问题,使用 JOCL 在 Java 中的 OpenCL 中进行反向传播学习。下面是计算阶段的内核代码:

    #pragma OPENCL EXTENSION cl_khr_fp64 : enable
__kernel void Neuron(__global const double *inputPatterns,
__global double *weights,
__global const int *numInputs,
__global const int *activation,
__global const double *bias,
__global const int *usingBias,
__global double *values,
__global const int *maxNumFloats,
__global const int *patternIndex,
__global const int *inputPatternSize,
__global const int *indexOffset,
__global const int *isInputNeuron,
__global const int *inputs)
{
int gid = get_global_id(0);
double sum = 0.0;
for(int i = 0; i < numInputs[gid+indexOffset[0]]; i++)
{
sum += values[inputs[(gid+indexOffset[0]) * maxNumFloats[0] + i]] *
weights[(gid+indexOffset[0]) * maxNumFloats[0] + i];
}
if(usingBias[gid+indexOffset[0]])
sum += bias[gid+indexOffset[0]];
if(isInputNeuron[gid+indexOffset[0]])
sum += inputPatterns[gid+indexOffset[0]+(patternIndex[0] * inputPatternSize[0])];
if(activation[gid+indexOffset[0]] == 1)
sum = 1.0 / (1.0 + exp(-sum));
values[gid + indexOffset[0]] = sum;
}

基本上,我为网络中的每一层运行这个内核。对于第一层,没有“输入”,因此不会执行循环。然而,由于第一层是输入节点层,它确实添加了输入模式中的相关值。这执行得很好,此时我可以读回这些值。

然而,当我尝试运行第二层(它有输入,第一层的每个节点)时,调用 clFinish() 会返回错误 CL_INVALID_COMMAND_QUEUE。有时此错误与驱动程序崩溃和恢复有关。我已经阅读(例如 here)这可能是 TDR 超时的问题,并尝试提高限制但不确定这是否有任何区别。

我正在调用 clSetKernelArg() 来检查是否有任何愚蠢的东西,但是有人能在代码中发现任何明显的错误吗?由于包含 for 循环,似乎在第二层引入了错误......如果需要,我可以澄清任何参数,但对于初始帖子来说似乎有点矫枉过正。

另外,我完全知道这段代码可能会冒犯各地有能力的编码人员,但请随意发火:P

编辑:主机代码:
    //Calc
for(int k = 0; k < GPUTickList.length; k++)
{
clFlush(clCommandQueue);
clFinish(clCommandQueue);
//If input nodes
if(k == 0)
//Set index offset to 0
GPUMapIndexOffset.asIntBuffer().put(0, 0);
else
//Update index offset
GPUMapIndexOffset.asIntBuffer().put(0,
GPUMapIndexOffset.asIntBuffer().get(0) + GPUTickList[k-1]);
//Write index offset to GPU buffer
ret = clEnqueueWriteBuffer(clCommandQueue, memObjects[12], CL_TRUE, 0,
Sizeof.cl_int, Pointer.to(GPUMapIndexOffset.position(0)), 0, null, null);
//Set work size (width of layer)
global_work_size[0] = GPUTickList[k];
ret = clEnqueueNDRangeKernel(clCommandQueue, kernel_iterate, 1,
global_work_offset, global_work_size, local_work_size,
0, null, null);
}

编辑 2:我已将完整代码上传到 pastebin .

最佳答案

解决了。通过使以 [0] 索引的所有内容成为直接内核参数而不是缓冲区来修复错误。很明显,硬件不喜欢一次访问缓冲区的一个特定元素的大量内容。

关于neural-network - 这个 OpenCL 内核如何导致错误 CL_INVALID_COMMAND_QUEUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10001521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com