我在使用CUDA 5.5的Visual Studio 2012中遇到此问题,该文件由Nvidia提供的文件“FLOAT_UTIL_DEVICE.HCU”。根据类似的问题,它可能是代码结构的问题,但我看不出任何问题:
#include <vector_functions.h>
#include <device_functions.h>
//// ADDED BY ME FOR TEST PURPOSES
//inline __device__ float uint2float( unsigned int a )
//{
// return (float) a;
//}
//// END
inline __device__ float2 uintd_to_floatd( uint2 a )
{
return make_float2( uint2float(a.x), uint2float(a.y) );
}
inline __device__ float3 uintd_to_floatd( uint3 a )
{
return make_float3( uint2float(a.x), uint2float(a.y), uint2float(a.z) );
}
inline __device__ float4 uintd_to_floatd( uint4 a )
{
return make_float4( uint2float(a.x), uint2float(a.y), uint2float(a.z), uint2float(a.w) );
}
根据Nvidia文档,有问题的方法应在“device_functions.h”中定义。如果我取消注释测试代码(定义缺少的函数),我会得到一个新错误:“重载函数的多个实例”uint2float“匹配参数列表”;因此它已经被定义了。我错过了什么?
答案 0 :(得分:1)
我无法使用gcc在CUDA 5.0中重现此问题。如果我使用您的设备功能完成一个完整的repro案例:
#include <vector_functions.h>
#include <device_functions.h>
inline __device__ float2 uintd_to_floatd( uint2 a )
{
return make_float2( uint2float(a.x), uint2float(a.y) );
}
inline __device__ float3 uintd_to_floatd( uint3 a )
{
return make_float3( uint2float(a.x), uint2float(a.y),
uint2float(a.z) );
}
inline __device__ float4 uintd_to_floatd( uint4 a )
{
return make_float4( uint2float(a.x), uint2float(a.y),
uint2float(a.z), uint2float(a.w) );
}
template<typename Tin, typename Tout>
__global__
void kernel(Tin *in, Tout *out) {
out[threadIdx.x] = uintd_to_floatd(in[threadIdx.x]);
}
template __global__ void kernel<uint2,float2>(uint2 *, float2 *);
template __global__ void kernel<uint3,float3>(uint3 *, float3 *);
template __global__ void kernel<uint4,float4>(uint4 *, float4 *);
并编译它:
$ nvcc -c -arch=sm_20 -Xptxas="-v" uint2float.cu
ptxas info : 0 bytes gmem
ptxas info : Compiling entry function '_Z6kernelI5uint36float3EvPT_PT0_' for 'sm_20'
ptxas info : Function properties for _Z6kernelI5uint36float3EvPT_PT0_
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 7 registers, 40 bytes cmem[0]
ptxas info : Compiling entry function '_Z6kernelI5uint46float4EvPT_PT0_' for 'sm_20'
ptxas info : Function properties for _Z6kernelI5uint46float4EvPT_PT0_
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 8 registers, 40 bytes cmem[0]
ptxas info : Compiling entry function '_Z6kernelI5uint26float2EvPT_PT0_' for 'sm_20'
ptxas info : Function properties for _Z6kernelI5uint26float2EvPT_PT0_
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 6 registers, 40 bytes cmem[0]
它构建没有任何编译错误。这或者意味着您没有向我们展示某些代码中的另一个错误,或者这是Visual Studio或MS C ++编译器特有的问题。使用某些向量类型的推力代码是known to break when compiled with the VS toolchain。可能是您看到了同一问题的症状。如果您急需短期修复,可以尝试定义自己的矢量类型版本,然后重新编写__device__函数来代替这些类型。