2013-03-14 24 views
2

爲了測試設備上的printf()調用,我編寫了一個簡單的程序,它將中等大小的數組複製到設備並將設備數組的值打印到屏幕上。雖然該陣列已正確複製到設備,但printf()函數無法正常工作,從而失去了前幾百個數字。代碼中的數組大小是4096.這是一個錯誤還是我沒有正確使用這個函數?非常感謝。在設備上調用printf()的不完全輸出

編輯:我的GPU是的GeForce GTX 550I,具有計算能力2.1

我的代碼:從所述設備

#include<stdio.h> 
#include<stdlib.h> 
#define N 4096 

__global__ void Printcell(float *d_Array , int n){ 
    int k = 0; 

    printf("\n=========== data of d_Array on device==============\n"); 
    for(k = 0; k < n; k++){ 
     printf("%f ", d_Array[k]); 
     if((k+1)%6 == 0) printf("\n"); 
    } 
    printf("\n\nTotally %d elements has been printed", k); 
} 

int main(){ 

    int i =0; 

    float Array[N] = {0}, rArray[N] = {0}; 
    float *d_Array; 
    for(i=0;i<N;i++) 
     Array[i] = i; 


    cudaMalloc((void**)&d_Array, N*sizeof(float)); 
    cudaMemcpy(d_Array, Array, N*sizeof(float), cudaMemcpyHostToDevice); 
    cudaDeviceSynchronize(); 
    Printcell<<<1,1>>>(d_Array, N); //Print the device array by a kernel 
    cudaDeviceSynchronize(); 

    /* Copy the device array back to host to see if it was correctly copied */ 
    cudaMemcpy(rArray, d_Array, N*sizeof(float), cudaMemcpyDeviceToHost); 

    printf("\n\n"); 

    for(i=0;i<N;i++){ 
     printf("%f ", rArray[i]); 
     if((i+1)%6 == 0) printf("\n"); 
    } 
} 
+3

你可以更具體地瞭解'printf'失敗了嗎?它打印了空白還是隻打印了3996個數字?您是指主打印底部還是'PrintCell'打印? – evanmcdonnal 2013-03-14 22:49:36

+0

對不起,我指的是Printcell中的printf。謝謝。 – Stone 2013-03-15 09:45:05

回答

11

printf的具有有限的隊列。它旨在用於小規模調試式輸出,而不是大規模輸出。

programmer's guide

的printf的輸出緩衝器()設置爲內核發射前一個固定大小的(見相關的主機端API)。它是循環的,如果在內核執行過程中產生的輸出比在緩衝區中更多,那麼舊的輸出將被覆蓋。

您的內核printf輸出超出了緩衝區,因此在將緩衝區轉儲到標準I/O隊列之前,第一個打印元素丟失(覆蓋)。

+0

非常感謝。我應該仔細閱讀文檔。 – Stone 2013-03-15 09:49:27