0

类似于链接的问题

我遇到了“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__找不到符号“ ”的定义。

4

1 回答 1

1

首先确保正确安装了 CUDA 工具包,并设置了所有路径(包括、lib 和 bin)。还要检查您是否包含cuda_runtime.hcu文件中。

如果您认为问题出在目标架构上,那么...

用以下#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
    } 
};
于 2013-03-19T07:35:23.080 回答