我試圖從內核使用調用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
所以這不是在GPU上運行或使用NVIDIA CUDA運行時庫,它只能用模擬器完成? – talonmies 2013-03-23 07:50:12
是的,我用GPUOcelot運行程序, – 2013-03-23 10:00:09
所以這個問題實際上與NVIDIA或CUDA無關。 Ocelot使用自己的PTX編譯器和運行時的實現。你應該詢問Ocelot的作者。 – talonmies 2013-03-23 14:20:56