CUDA / C++:错误C3861:"uint2float":找不到标识符
CUDA / C++ : error C3861: 'uint2float': identifier not found
我在Visual Studio 2012中使用CUDA 5.5在文件"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"的多个实例与参数列表匹配";因此,不知何故它已经被定义。我错过了什么?
我无法使用 gcc 在 CUDA 5.0 中重现此问题。如果我使用您的设备功能进行完整的复制案例:
#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++编译器的问题。已知使用某些矢量类型的推力代码在使用 VS 工具链编译时会中断。可能是您看到了同一问题的症状。如果您迫切需要短期修复,您可以尝试定义自己的矢量类型版本,并重写__device__函数以使用这些类型。
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- vcpkg 添加新库,但找不到
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- CUDA / C++:错误C3861:"uint2float":找不到标识符