【发布时间】:2013-03-04 09:44:56
【问题描述】:
当用 C 告诉我的电脑时
printf("%d",(int)-1);
我确实期望并且通常也会得到“-1”响应。然而,在我的 Tesla M2090 Nvidia Card 上,我的基于 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 吗?如果是,请告诉我为什么?非常感谢,马库斯。
【问题讨论】:
-
由于
sp->size,只有可能的未定义行为可能是内存分配。如果不。不要忘记重新编译代码然后执行。我猜 :)printf("%d",(int)-1);绝对没有问题 -
这是对我自己的问题的更新:如果我对 size_t 使用“%lu”,对臭名昭著的“-1”使用“%d”,它似乎可以工作。因此,可能与该设备出于某种原因需要 C90 样式 %lu 有关。仍然:在内核代码之外 %zd 和 %d 工作正常。我保持这个问题是开放的,因为我仍然看不到大小值的错误格式化程序会如何破坏 -1 的格式。
标签: cuda printf format-specifiers