使用CUDA计算2个向量的总和

时间:2018-11-24 16:48:35

标签: c++ cuda

我有一个似乎无法解决的简单任务。我得到了2个由10个元素组成的一维数组(称为向量)。数组的每个元素都包含一个随机正数。目标是使用CUDA计算每个索引号的那2个数组的总和(换句话说:Vector Sum [0] = Vector A [0] + Vector B [0],然后等于1,2。 .10)

这是我的代码(kernel.cu)。我知道我将“ float-anything”变量名称用于整数数据类型。那是因为我最初计划对float数据类型执行此操作,但是由于数据类型不兼容,我无法使项目完全正常工作。如果实际上可以使用float数据类型,请纠正我。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>

__global__ void vecAdd_kernel(int *floatAr1gpu, int *floatAr2gpu, int *floatSumGPU, int The_N){
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < The_N) floatSumGPU[i] = floatAr1gpu[i] + floatAr2gpu[i];
}

int main() 
{
    const unsigned int arraySize = 10;
    int floatArray1[arraySize];
    int floatArray2[arraySize];
    int *floatAr1gpu = 0;
    int *floatAr2gpu = 0;
    int floatSum[arraySize];
    int *floatSumGPU = 0;

    for (int c = 0; c < arraySize; c++) {
        floatArray1[c] = (rand() % 10)+1;
        floatArray2[c] = (rand() % 10)+1;
    }
    //Put the data into the GPU now
    //                      V--- This is allocating GPU memory under that name and Variable
    cudaMalloc((void **)&floatArray1, sizeof(float)*arraySize);
    cudaMalloc((void **)&floatArray2, sizeof(float)*arraySize);
    cudaMalloc((void **)&floatSum, sizeof(float)*arraySize);

    //           CPU Memory    GPU Mem       Array size              Method
    cudaMemcpy(floatArray1, floatAr1gpu, sizeof(float)*arraySize, cudaMemcpyHostToDevice);
    cudaMemcpy(floatArray2, floatAr2gpu, sizeof(float)*arraySize, cudaMemcpyHostToDevice);

    // execute
    //         grid size, block size
    vecAdd_kernel << < 1, arraySize >> > (floatArray1, floatArray2, floatSum, arraySize);

    //Copy data back from GPU to RAM
    //          GPU Memory   CPU Mem       Array size               Method
    cudaMemcpy(floatSumGPU, floatSum, sizeof(float)*arraySize, cudaMemcpyDeviceToHost);

    // clean up
    cudaFree(floatArray1);
    cudaFree(floatArray2);
    cudaFree(floatSum);

    for (int cc = 0; cc < arraySize; cc++) {
        std::cout << "Result of array number " << cc << " = " << floatSum[cc] << std::endl;
    }
    std::cout << "Done. Press any key to exit." << std::endl;
    char key = std::cin.get();

    return 0;
}

这就是我得到的结果:Program result

这是我想要实现的(使用CUDA):Program result

代码有什么问题?我在此处放置了一个断点来检查该数组:array contents

1 个答案:

答案 0 :(得分:3)

无需过多检查代码:很可能在某个地方收到CUDA错误,而不是退出并报告该错误,而是像一切成功一样进行尝试。不要那样做cudaGetLastError()是您的朋友;或者更好的是,阅读以下内容:

What is the canonical way to check for errors using the CUDA runtime API?

还,您应该使用cuda-memcheck工具(CUDA随附)来查看它是否发现程序中存在任何无效的内存访问以及其他与内存相关的问题(感谢@RobertCrovella提醒我)。运行它,我们从您的程序中得到很多错误,例如:

========= Program hit cudaErrorInvalidValue (error 11) due to "invalid argument" on CUDA API call to cudaMemcpy. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x357283]
=========     Host Frame:a [0x3d70f]
=========     Host Frame:a [0x644c]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf1) [0x202e1]
=========     Host Frame:a [0x609a]

因此-同样,在不检查代码的情况下-您必须为cudaMemcpy()提供了错误的参数。根据{{​​3}}检查您的程序。