【问题标题】:Cuda program does not give the correct output when using a CUDA compatible GPU使用与 CUDA 兼容的 GPU 时,Cuda 程序无法提供正确的输出
【发布时间】:2013-03-03 01:21:32
【问题描述】:

我从http://llpanorama.wordpress.com/2008/05/21/my-first-cuda-program/找到了以下程序

很遗憾我不能在这里复制粘贴,因为代码变得乱七八糟

它将一个数字向量作为输入,然后将向量乘以自身作为输出,我在计算机上安装的模拟器上运行它,它会给出以下输出:

0 0.000000
1 1.000000
2 4.000000
3 9.000000
4 16.000000
5 25.000000
6 36.000000
7 49.000000
8 64.000000
9 81.000000

但是,如果我决定在运行 debian 且具有 cuda 兼容 gpu 的远程计算机上运行它,请输入

nvcc test.cu -lcudart -o test
./test

它给了我以下输出

0 0.000000
1 1.000000
2 2.000000
3 3.000000
4 4.000000
5 5.000000
6 6.000000
7 7.000000
8 8.000000
9 9.000000

为什么会这样?提前谢谢!

【问题讨论】:

  • 首先要考虑的是卡的兼容性可能存在双重/浮动问题。您在每种情况下都运行浮点数还是双打?我相信随着 CUDA 架构的成熟,浮点/双精度功能会发生一些变化。
  • 该 URL 处的程序不进行任何错误检查。我建议为所有 CUDA API 调用和内核启动添加错误检查。
  • 通过查看代码,计算中涉及的数组是一个浮点变量

标签: cuda gpu


【解决方案1】:

问题是代码没有错误检查,远程计算机有问题。将error checking 添加到该代码中(这并不难),重新运行它,然后看看会发生什么。如果仍有问题,请反馈。

这是经过错误检查适当修改的代码:

// example1.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <cuda.h>

#define cudaCheckErrors(msg) \
    do { \
        cudaError_t __err = cudaGetLastError(); \
        if (__err != cudaSuccess) { \
            fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                msg, cudaGetErrorString(__err), \
                __FILE__, __LINE__); \
            fprintf(stderr, "*** FAILED - ABORTING\n"); \
            exit(1); \
        } \
    } while (0)

// Kernel that executes on the CUDA device
__global__ void square_array(float *a, int N)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx<N) a[idx] = a[idx] * a[idx];
}

// main routine that executes on the host
int main(void)
{
  float *a_h, *a_d;  // Pointer to host & device arrays
  const int N = 10;  // Number of elements in arrays
  size_t size = N * sizeof(float);
  a_h = (float *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  cudaCheckErrors("cudaMalloc fail");
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) a_h[i] = (float)i;
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  cudaCheckErrors("cudaMemcpy 1 fail");
  // Do calculation on device:
  int block_size = 4;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  square_array <<< n_blocks, block_size >>> (a_d, N);
  cudaDeviceSynchronize();
  cudaCheckErrors("kernel fail");
  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
  cudaCheckErrors("cudaMemcpy 2 fail");
  // Print results
  for (int i=0; i<N; i++) printf("%d %f\n", i, a_h[i]);
  // Cleanup
  free(a_h); cudaFree(a_d);

}

【讨论】:

  • 因为我是 CUDA 新手,所以需要一些时间,我稍后会报告!谢谢
  • 好的,我添加了修改错误检查的代码,以给你一个例子。您现在要做的就是复制和粘贴。
  • 您好,非常感谢您的代码,我收到以下错误:致命错误:cudaMalloc 失败(在 test.cu:34 未检测到支持 CUDA 的设备)***失败 - 正在中止很奇怪,安装了 cuda,但没有找到支持 cuda 的 gpu。我可能不得不联系管理员!也许他在错误的节点上为我创建了一个帐户。再次感谢您!
  • 这实际上是一个特权问题。所以如果你有类似的问题,请检查你的用户是否有权限在 GPU 上运行程序。
猜你喜欢
  • 2016-11-19
  • 1970-01-01
  • 2014-07-06
  • 2021-02-04
  • 1970-01-01
  • 2022-10-15
  • 2011-10-01
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多