gpt4 book ai didi

cuda - 使用 CUDA 实现神经网络

转载 作者:行者123 更新时间:2023-12-01 14:59:33 25 4
gpt4 key购买 nike

我正在尝试使用 CUDA 创建一个神经网络:

我的内核看起来像:

__global__ void feedForward(float *input, float *output, float **weight) {

//Here the threadId uniquely identifies weight in a neuron
int weightIndex = threadIdx.x;

//Here the blockId uniquely identifies a neuron
int neuronIndex = blockIdx.x;

if(neuronIndex<NO_OF_NEURONS && weightIndex<NO_OF_WEIGHTS)
output[neuronIndex] += weight[neuronIndex][weightIndex]
* input[weightIndex];
}

将输出复制回主机时出现错误

在第 xx 行出现未指定的启动失败错误

第 xx 行:

CUDA_CHECK_RETURN(cudaMemcpy(h_output, d_Output, output_size, cudaMemcpyDeviceToHost));

我是不是做错了什么?

是不是因为我同时使用 block 索引和线程索引来引用权重矩阵。还是问题出在其他地方?

我正在按如下方式对权重矩阵进行 allcoating:

cudaMallocPitch((void**)&d_Weight, &pitch_W,input_size,NO_OF_NEURONS);

我的内核调用是:

feedForward<<<NO_OF_NEURONS,NO_OF_WEIGHTS>>>(d_Input,d_Output,d_Weight);

之后我调用:cudaThreadSynchronize();

我是 CUDA 编程的新手。任何帮助将不胜感激。

谢谢

最佳答案

输出代码有问题。虽然它不会产生所描述的错误,但会产生不正确的结果。

int neuronIndex = blockIdx.x;

if(neuronIndex<NO_OF_NEURONS && weightIndex<NO_OF_WEIGHTS)
output[neuronIndex] += weight[neuronIndex][weightIndex] * input[weightIndex];

我们可以看到单个 block 中的所有线程都同时写入一个内存单元。因此,udefined 结果是预期的。为避免这种情况,我建议减少共享内存中一个 block 内的所有值,并对全局内存执行一次写入。像这样:

__global__ void feedForward(float *input, float *output, float **weight) {

int weightIndex = threadIdx.x;
int neuronIndex = blockIdx.x;
__shared__ float out_reduce[NO_OF_WEIGHTS];

out_reduce[weightIndex] =
(weightIndex<NO_OF_WEIGHTS && neuronIndex<NO_OF_NEURONS) ?
weight[neuronIndex][weightIndex] * input[weightIndex]
: 0.0;
__syncthreads();

for (int s = NO_OF_WEIGHTS; s > 0 ; s >>= 1)
{
if (weightIndex < s) out_reduce[weightIndex] += out_reduce[weightIndex + s];
__syncthreads();
}

if (weightIndex == 0) output[neuronIndex] += out_reduce[weightIndex];
}

原来我不得不重写了你一半的小内核来帮助减少代码......

关于cuda - 使用 CUDA 实现神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428110/

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