Cuda内核计算数组

时间:2015-12-06 04:50:15

标签: c++ cuda

我正在学习一些基本的CUDA编程。我正在尝试使用host_a[i] = i初始化主机上的数组。该数组由N = 128个整数组成。我正在启动一个内核,每个块有1个块和128个线程,我希望在索引i处对整数进行平方。

我的问题是:

  1. 如何知道内核是否启动?我可以在内核中使用printf吗?

  2. 我程序的预期输出是以空格分隔的整数平方列表 -

  3. 1 4 9 16 ...

    我的代码出了什么问题,因为它会输出1 2 3 4 5 ...

    代码:

    #include <iostream>
    #include <numeric>
    #include <stdlib.h>
    #include <cuda.h>
    
    const int N = 128;
    
    __global__ void f(int *dev_a) {
        unsigned int tid = threadIdx.x;
    
        if(tid < N) {
            dev_a[tid] = tid * tid;
        }
    }
    
    int main(void) {
    
        int host_a[N];
        int *dev_a;
        cudaMalloc((void**)&dev_a, N * sizeof(int));
        for(int i = 0 ; i < N ; i++) {
            host_a[i] = i;
        }
        cudaMemcpy(dev_a, host_a, N * sizeof(int), cudaMemcpyHostToDevice);
        f<<<1, N>>>(dev_a);
    
        cudaMemcpy(host_a, dev_a, N * sizeof(int), cudaMemcpyDeviceToHost);
    
        for(int i = 0 ; i < N ; i++) {
            printf("%d ", host_a[i]);
        }
    }
    

1 个答案:

答案 0 :(得分:1)

  

我如何知道内核是否已启动?我可以在内核中使用printf吗?

您可以在任何计算能力2.0或更高版本的GPU上使用printf设备代码(只要#include <stdio.h>)。由于CUDA 7和CUDA 7.5仅支持这些类型的GPU,如果您使用的是CUDA 7或CUDA 7.5(已成功),则可以在设备代码中使用printf

  

我的代码出了什么问题?

如评论中所述,如果在正确设置的计算机上运行,​​则代码没有“错误”。为了解决您之前的问题“我如何才能知道内核是否已启动?”,我认为最好的方法是使用proper cuda error checking,除了告诉您内核是否启动之外还有很多好处。不。在这种情况下,它还可以提供有关您机器上的CUDA设置不正确的故障的线索。您还可以使用cuda-memcheck运行CUDA代码作为快速测试,以确定是否发生任何运行时错误。