CUDA 程序产生意想不到的结果

jos*_*shu 1 cuda

我正在关注有关并行计算的 udacity 系列,该系列是在 nvidia 的学习 cuda 网站上找到的,第一个程序正在计算非常奇怪的结果。

这段代码只是简单地计算一个数字的立方,但是程序产生的输出是:

#include <stdio.h>

__global__ void cube(float * d_out, float * d_in){
    int idx = threadIdx.x;
    float f = d_in[idx];
    d_out[idx]  = f * f * f;
}

int main(int argc, char ** argv) {
    const int ARRAY_SIZE = 64;
    const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);
    // generate the input array on the host
    float h_in[ARRAY_SIZE];
    for (int i = 0; i < ARRAY_SIZE; i++) {
        h_in[i] = float(i);
    }
    float h_out[ARRAY_SIZE];

    // declare GPU memory pointers
    float * d_in;
    float * d_out;

    // allocate GPU memory
    cudaMalloc((void**) &d_in, ARRAY_BYTES);
    cudaMalloc((void**) &d_out, ARRAY_BYTES);

    // transfer the array to the GPU
    cudaMemcpy(d_in, h_in, ARRAY_BYTES, cudaMemcpyHostToDevice);

    // launch the kernel
    cube<<<1, ARRAY_SIZE>>>(d_out, d_in);

    // copy back the result array to the CPU
    cudaMemcpy(h_out, d_out, ARRAY_BYTES, cudaMemcpyDeviceToHost);

    // print out the resulting array
    for (int i =0; i < ARRAY_SIZE; i++) {
        printf("%f", h_out[i]);
        printf(((i % 4) != 3) ? "\t" : "\n");
    }

    cudaFree(d_in);
    cudaFree(d_out);

    return 0;
}

    0.000000    0.000000    0.000000    0.000000
-13140721427756115471762456576.000000   0.000000    0.000006    0.000000
0.000000    0.000000    0.000000    0.000000
0.000000    0.000000    0.000003    0.000000
0.000000    0.000000    -13140721427756115471762456576.000000   0.000000
0.000000    0.000000    0.000006    0.000000
0.000000    0.000000    0.000000    0.000000
0.000000    0.000000    0.000000    0.000000
0.000000    0.000000    0.000003    0.000000
0.000000    0.000000    -13140721427756115471762456576.000000   0.000000
0.000000    0.000000    0.000000    0.000000
0.000006    0.000000    0.000000    0.000000
0.000000    0.000000    0.000000    0.000000
0.000006    0.000000    0.000000    0.000000
0.000000    0.000000    0.000000    0.000000
-13141061438142882086217842688.000000   0.000000    0.000000    0.000000



uname -a
Run Code Online (Sandbox Code Playgroud)

产生

Linux ubuntu14 3.19.0-43-generic #49~14.04.1-Ubuntu SMP Thu Dec 31 15:44:49 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

nvcc --version 生产

 nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Wed_Jul_17_18:36:13_PDT_2013
Cuda compilation tools, release 5.5, V5.5.0
Run Code Online (Sandbox Code Playgroud)

我从 apt-get 安装了这个,我正在运行 gtx 980 ti

我在 nvidia cuda 下载网站上注意到一件事,没有明确提到 ubuntu 14.04 支持 kernal 3.19,这可能只是一个内核问题吗?如果没有任何正确方向的点,我们将表示赞赏。

tal*_*ies 5

问题中的代码完全正确,但是 OP 为其 GPU 模型安装了不受支持的 CUDA 版本(带有 GTX 980Ti 的 CUDA 5.5)。升级到受支持的版本消除了该问题。

[注意:这个答案是根据评论汇总的,并添加为社区 wiki 条目,以将问题从 CUDA 标签的未回答列表中删除]