c++ - CUDA:请帮我找出代码中的错误

标签 c++ cuda gpu

有使用 GPU 的代码:

__global__ void gpu_process(float* input, float* weights, float* output, int psize, int size)
{
    int i = blockIdx.x*blockDim.x + threadIdx.x;
    int j = blockIdx.y*blockDim.y + threadIdx.y;
    if(i < psize && j < size)
        output[j] += input[i] * weights[i * size + j];
}
void process(float* input, float* weights, float* output, size_t psize, size_t size)
{
    float* in_d, *w_d, *out_d;
    cudaMalloc((void**)&in_d, psize * sizeof(float));
    cudaMalloc((void**)&w_d, psize * size * sizeof(float));
    cudaMalloc((void**)&out_d, size * sizeof(float));
    for(size_t i = 0; i < size; i++)
        output[i] = 0;
    cudaMemcpy(in_d, input, psize * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(w_d, weights, psize * size * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(out_d, output, size * sizeof(float), cudaMemcpyHostToDevice);
    int rx = psize, ry = size, block_x = min((int)psize, 32), block_y = min((int)size, 32);
    dim3 dimBlock(block_x, block_y);
    dim3 dimGrid(ceil(float(rx) / block_x), ceil(float(ry) / block_y));
    gpu_process<<<dimGrid, dimBlock>>>(in_d, w_d, out_d, psize, size);
    cudaThreadSynchronize();
    cudaMemcpy(output, out_d, size * sizeof(float), cudaMemcpyDeviceToHost);
    cudaFree(in_d);
    cudaFree(out_d);
    cudaFree(w_d);
}

有代码,做同样的事情,但只使用 CPU:

int blockIdxx, blockIdxy, blockDimx, blockDimy, threadIdxx, threadIdxy;
void cpu_process(float* input, float* weights, float* output, int psize, int size)
{
    int i = blockIdxx*blockDimx + threadIdxx;
    int j = blockIdxy*blockDimy + threadIdxy;
    if(i < psize && j < size)
        output[j] += input[i] * weights[i * size + j];
}
void process(float* input, float* weights, float* output, size_t psize, size_t size)
{
    for(size_t i = 0; i < size; i++)
            output[i] = 0;
    int rx = psize, ry = size, block_x = min((int)psize, 32), block_y = min((int)size, 32);
    blockDimx = block_x;
    blockDimy = block_y;
    int gridDimx = ceil(float(rx) / block_x), gridDimy = ceil(float(ry) / block_y);
    for(blockIdxx = 0; blockIdxx < gridDimx; blockIdxx++)
        for(blockIdxy = 0; blockIdxy < gridDimy; blockIdxy++)
            for(threadIdxx = 0; threadIdxx < blockDimx; threadIdxx++)
                for(threadIdxy = 0; threadIdxy < blockDimy; threadIdxy++)
                    cpu_process(input, weights, output, psize, size);
}

为什么 CPU 变体工作正常但 GPU 变体在输出中返回垃圾?有什么不同

cuda-toolkit 版本:4.0

操作系统:Debian GNU/Linux,从其存储库安装 cuda。

GPU:NVIDIA GeForce GT 525M。

最佳答案

cudaThreadSyncronize 已被弃用,不应使用,而是使用 cudaDeviceSyncronize,检查它们的错误代码,因为如果线程失败,它们将返回错误。这些还会阻塞此后的所有代码,直到任务完成,因此您还可以在其间添加一些计时代码来查找瓶颈。

关于c++ - CUDA:请帮我找出代码中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6982167/

相关文章:

c++ - CUDA cudaMemcpy 数组结构

c# - 通过 C# 使用 GPU

r - ArcView 和/或 R 是否使用显卡 (GPU) 加速

c++ - 使用 std::vector 类构造函数对 C 数组进行 Constexpr 包装

build - NVCC - 主机编译器针对不支持的操作系统

c++ - calloc 最合适的 C++ 替代品是什么?

cuda - Thrust 设备管理和内核

c++ - 使用 GPU (C++/OpenCV) 显示文件中的图像

C++: boost 指向错误元素的范围迭代器

C++ 在 char(头文件)之前期望主表达式