【问题标题】:Cuda kernel to compute squares of integers in an array用于计算数组中整数平方的 Cuda 内核
【发布时间】:2015-12-07 06:14:21
【问题描述】:

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

我的问题是:

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

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

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]);
    }
}

【问题讨论】:

  • 您的代码没有任何问题,只是缺少proper cuda error checking。当我运行您的代码时,它会打印出 0 1 4 9 16 25 ... 所以我相信您的 CUDA 设置有问题,正确的 cuda 错误检查将有助于识别问题。您也可以使用cuda-memcheck 运行您的代码,这可能会让您了解问题所在。如果您使用的是受 CUDA 7 或 CUDA 7.5 支持的最新 GPU,则可以在内核中使用 printf
  • 好的,谢谢!我的 Nsight 现在说找不到 CUDA 兼容设备,尽管我可以在 Mac OS X 10.10.2 的系统偏好设置中看到 CUDA。无论如何,这是另一个问题。感谢您指出错误检查部分。

标签: c++ cuda


【解决方案1】:

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

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

我的代码有什么问题?

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

【讨论】:

  • 在我的代码中添加错误检查帮助我识别错误。安装的 CUDA 运行时版本不支持我的 CUDA SDK 版本。降级到 CUDA 6.5 使该程序为我运行。
猜你喜欢
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多