错误:标识符“atomicCAS”& " atomicExch"在visual studio 2012& cuda 5

时间:2013-03-19 05:54:02

标签: visual-studio-2012 cuda compiler-errors atomic compiler-flags

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__”的定义。

1 个答案:

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