2013-09-13 2 views
0

Я испытываю эту проблему в Visual Studio 2012, используя CUDA 5.5, в файле FLOAT_UTIL_DEVICE.HCU, который предоставляется Nvidia. По аналогичным вопросам, это может быть вопросом структуры кода, но я не вижу никаких проблем:CUDA/C++: ошибка C3861: 'uint2float': идентификатор не найден

#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)); 
} 

Методы в вопросе должны быть определены в «device_functions.h» в соответствии с Nvidia документации. Если я раскомментирую тестовый код (который определяет функцию, которая отсутствует), я получаю новую ошибку: «более одного экземпляра перегруженной функции« uint2float »соответствует списку аргументов»; поэтому как-то он уже определен. Что мне не хватает?

+0

Вы пытались добавить пространство имён перед ними? – Paddyd

+1

Пожалуйста, разместите полное сообщение об ошибке. – Peter

+0

@Peter: «ошибка C3861:« uint2float »: идентификатор не найден» - это полное сообщение об ошибке. – emher

ответ

1

Я не могу воспроизвести эту проблему в CUDA 5.0 с использованием gcc. Если взять полный 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__ для работы с этими типами.

Смежные вопросы