2013-03-23 48 views
0

我試圖從內核使用調用printf打印浮點值。我這樣做是爲了檢查我正在處理的另一個程序,它需要將浮點數組從主機複製到設備。我編寫了一個內核來檢查存儲在設備中float數組中的值,僅獲得0的回報。打印數組的值之前,從內核返回垃圾調用CUDA printf float?

所以我寫了這個代碼來檢查:

#include <stdio.h> 

#define ARR_LENGTH 3 

__global__ void checkArr(float* arr); 

int main(void) 
{ 
    float* arr = (float*) malloc(sizeof(float) * ARR_LENGTH); 

    float cont = 0; 
    for(int i = 0 ; i < ARR_LENGTH ; i++) { 
     arr[i] = cont; 
     cont++; 
    } 

    for(int i = 0 ; i < ARR_LENGTH ; i++) { 
     printf("arr[%d] : %f\n", i , arr[i]); 
    } 


    float* d_arr; 
    cudaMalloc((void**) &d_arr, sizeof(float) * ARR_LENGTH); 
    cudaMemcpy(d_arr, arr, sizeof(float) * ARR_LENGTH, cudaMemcpyHostToDevice); 

    printf("got here\n"); 

    checkArr<<<1,1>>>(d_arr); 

    printf("got here\n"); 

    float* check = (float*) malloc(sizeof(float) * ARR_LENGTH); 
    cudaMemcpy(check, d_arr, sizeof(float) * ARR_LENGTH, cudaMemcpyDeviceToHost); 
    for(int i = 0 ; i < ARR_LENGTH ; i++) { 
     printf("arr[%d] : %f\n", i , check[i]); 
    } 

} 

__global__ void checkArr(float* arr) 
{ 
    float check = 5.0; 
    printf("float check : %f\n", check); 
    printf("float check : %f\n", check + 1.0); 
    printf("float check : %f\n", check + 2.0); 

    for(int i = 0 ; i < ARR_LENGTH ; i++) { 
     printf("arr[%d] : %f\n", i , arr[i]); 
    } 
} 

與輸出:

arr[0] : 0.000000 
arr[1] : 1.000000 
arr[2] : 2.000000 
got here 
float check : 0 
float check : 0 
float check : 0 
arr[0] : 2.4375 
arr[1] : 2.4375 
arr[2] : 2.4375 
got here 
arr[0] : 0.000000 
arr[1] : 1.000000 
arr[2] : 2.000000 

,如果我沒有把「浮動檢查」該數組的值將返回0。這有點奇怪..任何解釋?這是否意味着我無法檢查設備內存中float值的值? (你可以看到,int似乎返回正常)

我編譯程序與-arch=sm_20。由於我在家中沒有兼容CUDA的設備,因此我使用GPUOcelot編譯並運行檢查。你能用兼容的設備重現這個錯誤嗎?

乾杯, AErlaut

+0

所以這不是在GPU上運行或使用NVIDIA CUDA運行時庫,它只能用模擬器完成? – talonmies 2013-03-23 07:50:12

+0

是的,我用GPUOcelot運行程序, – 2013-03-23 10:00:09

+0

所以這個問題實際上與NVIDIA或CUDA無關。 Ocelot使用自己的PTX編譯器和運行時的實現。你應該詢問Ocelot的作者。 – talonmies 2013-03-23 14:20:56

回答

1

當我編譯和實際sm_20 GPU(M2090)運行代碼我得到以下輸出。

$ ./t97 
arr[0] : 0.000000 
arr[1] : 1.000000 
arr[2] : 2.000000 
got here 
got here 
float check : 5.000000 
float check : 6.000000 
float check : 7.000000 
arr[0] : 0.000000 
arr[1] : 1.000000 
arr[2] : 2.000000 
arr[0] : 0.000000 
arr[1] : 1.000000 
arr[2] : 2.000000 
$ 

注意的printf從真實設備上的內核是有點異步來自主機中的printf隊列中,以便可以輸出顯示爲以不同的順序。

我的觀點是告訴你GPU行爲和Ocelot行爲可能會有所不同。如果您繼續發佈「請在我的GPU上檢查我的Ocelot程序」,我將不會回覆這些問題。

+0

我還沒有在真實的GPU上測試代碼,所以我認爲它不會運行。感謝您的確認 – 2013-03-23 18:08:59