3

デバイスで printf() 呼び出しをテストする目的で、適度なサイズの配列をデバイスにコピーし、デバイス配列の値を画面に出力する簡単なプログラムを作成しました。配列はデバイスに正しくコピーされますが、printf() 関数が正しく機能せず、最初の数百の数値が失われます。コードの配列サイズは 4096 です。これはバグですか、それともこの関数を正しく使用していませんか? 事前に感謝します。

編集: 私の 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");
    }
}
4

1 に答える 1

13

デバイスからの printf のキューは限られています。大規模な出力ではなく、小規模なデバッグ スタイルの出力を対象としています。

プログラマーズガイドを参照してください:

printf() の出力バッファは、カーネルの起動前に固定サイズに設定されます (関連するホスト側 API を参照)。これは循環的であり、カーネルの実行中にバッファに収まりきらないほど多くの出力が生成された場合、古い出力が上書きされます。

カーネル内の printf 出力がバッファーをオーバーランしたため、バッファーが標準 I/O キューにダンプされる前に、最初に出力された要素が失われました (上書きされました)。

リンクされたドキュメントは、バッファサイズも増やすことができることを示しています。

于 2013-03-14T23:12:01.360 に答える