輸出錯誤時告訴我的電腦用C(INT)-1的CUDA內核的printf給人以%d符
printf("%d",(int)-1);
我也想到,通常可以得到,同樣,一個 '-1' 的迴應。然而,在我的Tesla M2090 NVIDIA顯卡從我的基於Ubuntu的Cuda的5.0這個無辜的演示程序
/** cheese.cu */
#include <iostream>
#include <cuda.h>
#include <cstdio>
using namespace std;
template<typename T> struct SpacePtr
{ size_t size; T* ptr; };
__global__ void f(SpacePtr<int>* sp)
{
printf("This _is_ a 'minus one' or ain't it: %d\n",(int)-1);
// Note: All appears to work fine with %lu instead of %zd
// Still: How does the size value affect the -1?
printf("On DEV: Size: %zd, Minus One: %d\n",sp->size,(int)-1);
}
int main()
{
SpacePtr<int> data; data.ptr = 0; data.size = 168;
SpacePtr<int>* devPtr = 0;
cudaMalloc(&devPtr,1);
cudaMemcpy(devPtr,&data,sizeof(SpacePtr<int>),cudaMemcpyHostToDevice);
f<<<1,1,0,0>>>(devPtr);
cudaError_t err = cudaGetLastError();
cout << "The last error code was " << err << " (" <<
cudaGetErrorString(err) << ")" << endl;
cudaDeviceSynchronize();
}
編譯並通過
nvcc -arch=sm_20 cheese.cu && ./a.out
稱爲談過產生的輸出:
The last error code was 0 (no error)
This _is_ a 'minus one' or ain't it: -1
On DEV: Size: 168, Minus One: 10005640
最後一個數字實際上是某種隨機數(兩個子查詢返回不同的結果),就好像內存分配有什麼不對。 -1之前的(int)已經是試錯了。原來的程序沒有它。
這裏是問題:有沒有人看,爲什麼-1不寫,如果是這樣,請你告訴我,爲什麼?非常感謝,Markus。
唯一可能的不確定的行爲可能是內存分配。如果不。不要忘記重新編譯代碼然後執行。我猜:)對於'printf(「%d」,(int)-1)defiantly沒有問題;' – 2013-03-04 09:51:08
這是我自己的問題的更新:如果我使用「%lu」作爲size_t和「 %d「爲臭名昭着的」-1「。所以可能與設備出於某種原因需要C90風格%lu有關。仍然:在內核代碼%zd和%d之外工作正常。我保持開放的問題,我仍然沒有看到一個大小值錯誤的格式化程序如何破壞-1的格式。 – 2013-03-04 10:02:11