への呼び出しを使用して、カーネルから 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を使用してチェックを実行しました。互換性のあるデバイスでこのエラーを再現できますか?
乾杯、アーラウト