Similar to the linked question
我遇到了“atomicCAS”& “atomicExch”标识符未找到错误。 我在网上搜索解决方案,但仍然无法解决我的问题。
我还在项目配置中将代码生成更改为compute_20,sm_20:
“配置属性 - > CUDA C / C ++ - >设备 - >代码生成”
当我尝试“编辑”此项时,我发现“继承的值:compute_10,sm_10”。
此外,当我试图右键单击“atomicCAS”或“atomicExch”函数并从菜单“Go To Definition(F12)”中选择时,我发现它指向“$(CudaToolkitIncludeDir)\ sm_11_atomic_functions.h (191)”。
1。如何克服继承的compute_10,sm_10值?
2.为什么它使用sm_11_atomic_functions.h而不是sm_20_atomic_functions的原子函数?
3.或者任何人都可以帮忙详细描述如何解决这个问题。
非常感谢你。
让我们看看下面的代码。例如。
struct Lock {
int *mutex;
Lock( void ) {
HANDLE_ERROR( cudaMalloc( (void**)&mutex, sizeof(int) ) );
HANDLE_ERROR( cudaMemset( mutex, 0, sizeof(int) ) );
}
~Lock( void ) {
cudaFree( mutex );
}
__device__ void lock( void ) {
#if __CUDA_ARCH__ >= 200
while( atomicCAS( mutex, 0, 1 ) != 0 );
#endif
}
__device__ void unlock( void ) {
#if __CUDA_ARCH__ >= 200
atomicExch( mutex, 0 );
#endif
}
};
我收到了一条消息:无法找到符号“__CUDA_ARCH__
”的定义。
答案 0 :(得分:1)
首先确保正确安装了CUDA工具包,并设置了所有路径(include,lib和bin)。另外,请检查cuda_runtime.h
文件中是否包含cu
。
如果您认为问题是由目标架构引起的,那么......
使用以下#if
块包围内核代码:
//Compile kernel code for Compute 2.0 and above only
#if __CUDA_ARCH__ >= 200
//Kernel Code Here
#endif
这样,只有在为Compute 2.0及更高版本编译时才会编译内核代码。 对于较低的计算能力,编译器将生成虚拟内核。
如果您有更低计算能力的替代实施,您也可以这样做:
#if __CUDA_ARCH__ >= 200
//Code using atomicCAS, atomicExch
#else
//Alternate implementation
#endif
根据评论中提供的代码,您可以执行以下操作:
struct Lock
{
int *mutex;
__device__ Lock( void )
{
#if __CUDA_ARCH__ >= 200
mutex = new int;
(*mutex) = 0;
#endif
}
__device__ ~Lock( void )
{
#if __CUDA_ARCH__ >= 200
delete mutex;
#endif
}
__device__ void lock( void )
{
#if __CUDA_ARCH__ >= 200
while( atomicCAS( mutex, 0, 1 ) != 0 );
#endif
}
__device__ void unlock( void )
{
#if __CUDA_ARCH__ >= 200
atomicExch( mutex, 0 );
#endif
}
};