CUDA程序产生意外结果

时间:2016-03-06 15:54:08

标签: 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

生成

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

[注意:这个答案已经从评论中汇总并添加为社区wiki条目,以便从CUDA标签的未答复列表中获取问题]