私のコンピューターにCで話すとき
printf("%d",(int)-1);
私は期待しており、通常は「-1」の応答も受け取ります。しかし、私のUbuntuベースのCuda5.0から話された私のTeslaM2090 Nvidiaカードでは、この無実のデモプログラム
/** 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
最後の数値は、実際にはある種の乱数であり(2つの後続の呼び出しは異なる結果を返します)、メモリ割り当てで何かが間違っているかのようになります。-1の前の(int)は、すでに試行錯誤です。元のプログラムにはありませんでした。
そして、ここに質問があります:誰かが、なぜ-1が書かれていないのかわかりますか?もしそうなら、その理由を教えてください。どうもありがとう、マーカス。