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

09-06 13:02