【问题标题】:CUDA kernel function not called未调用 CUDA 内核函数
【发布时间】:2014-02-24 08:48:06
【问题描述】:

我开始使用 CUDA,但遇到了一些问题。我在下面发布的代码基本上是 NVIDIA 网站上最简单的示例,其中添加了一些内存副本和打印语句以确保其正常运行。

代码可以毫无问题地编译和运行,但是当我打印向量 c 时,它全为零,就好像根本没有调用 GPU 内核函数一样。

几乎和这篇文章一模一样 Basic CUDA - getting kernels to run on the device using C++.

症状是一样的,虽然我似乎没有犯这个错误。有什么想法吗?

#include <stdio.h>

static const unsigned short N = 3;

// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{
    int i = threadIdx.x;
    C[i] = A[i] + B[i];
} 

int main()
{
  float *A, *B, *C;
  float a[N] = {1,2,3}, b[N] = {4,5,6}, c[N] = {0,0,0};

  cudaMalloc( (void **)&A, sizeof(float)*N );
  cudaMalloc( (void **)&B, sizeof(float)*N );
  cudaMalloc( (void **)&C, sizeof(float)*N );

  cudaMemcpy( A, a, sizeof(float)*N, cudaMemcpyHostToDevice );
  cudaMemcpy( B, b, sizeof(float)*N, cudaMemcpyHostToDevice );

  VecAdd<<<1, N>>>(A, B, C);

  cudaMemcpy( c, C, sizeof(float)*N, cudaMemcpyHostToDevice );

  printf("%f %f %f\n", c[0],c[1],c[2]);

  cudaFree(A);
  cudaFree(B);
  cudaFree(C);

  return 0;
}

【问题讨论】:

  • 始终始终检查函数的返回值。在内核调用之后,也调用cudaGetLastError

标签: c cuda gpu


【解决方案1】:

在最后一次cudaMemcpy 调用中,您传递的内存复制方向标志不正确。

cudaMemcpy( c, C, sizeof(float)*N, cudaMemcpyHostToDevice );

应该是:

cudaMemcpy( c, C, sizeof(float)*N, cudaMemcpyDeviceToHost );

【讨论】:

  • 确实!但是,当我进行更改时,效果是一样的 - 向量 c 打印为零。
  • error checking 添加到您的代码中。意外输出可能有多种原因。你有哪个GPU?您为什么计算能力编译代码?
  • 我的机器有一个 G210M 和一个 9400M G。我不太确定 9400M G,但是 G210M 被列为具有 1.1 的计算能力,所以这就是我编译的.这是我一直在使用的命令行:nvcc cuda-test.cu -o cuda-test --gpu-code compute_11 --gpu-architecture=compute_11
  • 错误检查发现很多:GPUassert: CUDA driver version is insufficient for CUDA runtime version cuda-test.cu 30。在这一点上似乎很清楚驱动程序存在问题。
  • 重新安装驱动程序后,cuda 代码按预期运行。谢谢!
猜你喜欢
  • 2011-08-08
  • 2012-04-28
  • 1970-01-01
  • 2018-07-22
  • 2021-02-07
  • 1970-01-01
  • 2023-04-06
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多