2012-07-23 108 views
0

這是我的第一個(剽竊)CUDA程序;CUDA程序輸出錯誤

__global__ void vecAdd(float* A, float* B, float* C) 
    { 

     int i = threadIdx.x; 
     A[i]=0; 
     B[i]=i; 
     C[i] = A[i] + B[i]; 
    } 

    #include <stdio.h> 
    #define SIZE 10 
    int main() 
    { 
     int N=SIZE; 
     float A[SIZE], B[SIZE], C[SIZE]; 
     float *devPtrA; 
     float *devPtrB; 
     float *devPtrC; 
     int memsize= SIZE * sizeof(float); 

     cudaMalloc((void**)&devPtrA, memsize); 
     cudaMalloc((void**)&devPtrB, memsize); 
     cudaMalloc((void**)&devPtrC, memsize); 
     cudaMemcpy(devPtrA, A, memsize, cudaMemcpyHostToDevice); 
     cudaMemcpy(devPtrB, B, memsize, cudaMemcpyHostToDevice); 

     vecAdd<<<1, N>>>(devPtrA, devPtrB, devPtrC); 
     cudaMemcpy(C, devPtrC, memsize, cudaMemcpyDeviceToHost); 

     for (int i=0; i<SIZE; i++) 
     printf("C[%d]=%f B[%d]=%f\n",i,C[i],i,B[i]); 

     cudaFree(devPtrA); 
     cudaFree(devPtrA); 
     cudaFree(devPtrA); 
    } 

這裏是輸出:

埃林@ ubuntu的:〜$ NVCC -lcudart vecadd.cu

埃林@ ubuntu的:〜$ ./a.out

C [0 ] = 0.000000 B [0] = 0.000000

C [1] = 0.000000 B [1] = 0.000000

C [2] = - 0.344699 B [2] = 0.000000

C [3] = 0.000000 B [3] = 0.000000

C [4] = - 0.344700 B [4] = 0.000000

C [5] = 0.000000 B [5] = 0.000000

C [6] = 0.000000 B [6] = 0.000000

C [7] = 0.000000 B [7] = 0.000000

C [8] = 0.000000 B [8] = - 0.344690

C [9] = 0.000000 B [9] = 0.000000 erin @ ubuntu:〜$

這是在Pathetic Panda(?)12.04的Ubuntu 64位上。

感謝您的幫助!

真誠,

艾琳


預期的輸出應打印的價值iB[i]C[i]

+0

你的問題到底是什麼? (提示「幫助我的程序無法正常工作」對於堆棧溢出並不是真正有效的問題)。 CUDA API具有非常全面的錯誤檢查功能,您可以從檢查所有API調用的返回值開始,查看是否有任何錯誤,然後將它們添加到您的問題中。您可以提供有關您的問題的更多信息,這裏的某個人可能會幫助您。 – talonmies 2012-07-23 05:52:59

+0

我正在看它,我沒有看到問題,但是當我試圖編譯它時,我得到了同樣的錯誤輸出。 – CygnusX1 2012-07-23 08:51:23

回答

1

在我看來,你的CUDA調用簡單根本不起作用。 您確定系統中的所有內容都已正確安裝嗎?請嘗試以下操作:

與普瑞代碼:

void check() { 
    cudaError_t err = cudaGetLastError(); 
    if (err != cudaSuccess) { 
     printf("%s\n",cudaGetErrorString(err)); 
    } 
    exit(1); 
} 

而且把check()每個CUDA調用之後。您可能希望以較大代碼自動執行此操作,但出於測試目的,它應該已足夠。如果有什麼問題,你應該得到一個人類可讀的消息。在我來說,我得到:

CUDA driver version is insufficient for CUDA runtime version 

我將需要更新它;)

0

首先,沒有cudaMemcpy調用拷貝回主機陣列B,你需要添加cudaMemcpy(B, devPtrB, memsize, cudaMemcpyDeviceToHost);。 然後嘗試與

#include "device_launch_parameters.h" 
    __global__ void vecAdd(float* A, float* B, float* C) 

    {  
     int i = threadIdx.x; 
     A[i]=0; 
     B[i]=(float)i; 
     C[i] = (float)(A[i] + B[i]); 
    } 

的device_launch_parameters.h頭包含定義threadIdx更換設備的代碼。x調用,類型轉換爲浮動是可選的,在我的情況下,這段代碼工作正常,沒有它。