Similar to the linked question
我遇到“atomicCAS”和“atomicExch”标识符未找到错误。
我在网上搜索解决方案,但仍然无法解决我的问题。
我还在项目配置中将代码生成更改为compute_20,sm_20:“配置属性-> CUDA C/C++->设备->代码生成”
当我尝试“编辑”该项目时,我发现“继承的值:compute_10,sm_10”。
此外,当我尝试右键单击函数“atomicCAS”或“atomicExch”并从菜单“转到定义(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__
'的定义。 最佳答案
首先,请确保正确安装了CUDA工具包,并设置了所有路径(包括,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
}
};