0

への呼び出しを使用して、カーネルから float 値を出力しようとしていますprintf。ホストからデバイスに float 配列をコピーする必要がある、作業中の別のプログラムをチェックするためにこれを行っています。デバイスの float 配列内に格納されている値をチェックするカーネルを作成しましたが、その値を取得0するだけでした。

だから私はチェックするためにこのコードを書いた:

#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を使用してチェックを実行しました。互換性のあるデバイスでこのエラーを再現できますか?

乾杯、アーラウト

4

1 に答える 1

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 プログラムを確認してください」と投稿し続ける場合、私はそれらに応答しません。

于 2013-03-23T15:49:04.447 に答える