【问题标题】:error : identifiers “atomicCAS” & "atomicExch" are undefined under visual studio 2012 & cuda 5错误:标识符“atomicCAS”和“atomicExch”在 Visual Studio 2012 和 cuda 5 下未定义
【发布时间】:2013-03-19 05:54:01
【问题描述】:

Similar to the linked question

我遇到了“atomicCAS”和“atomicExch”标识符未找到错误。 我在网上搜索了解决方案,但仍然无法解决我的问题。

我还在项目配置中将Code Generation改为compute_20、sm_20:

“Configuration Properties -> CUDA C/C++ -> Device -> Code Generation”

当我尝试“编辑”此项时,我发现“继承值: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__”的定义。

【问题讨论】:

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


    【解决方案1】:

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

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

    用以下#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
        } 
    };
    

    【讨论】:

    • 谢谢 sgar91。是的,我确信 CUDA 工具包已正确安装并且所有路径都已设置。我还根据需要包含“cuda_runtime.h”。但是,我发现 CUDA_ARCH 是未定义的。它在哪里定义?我应该在某个头文件中自己定义它吗?
    • 你确定你是在内部内核做的吗?
    • @user2123066.. 请将代码作为问题的更新发布,并查看我更新的答案。
    • @sgar91..你知道宏__CUDA_ARCH__是在哪里定义的吗?
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2016-12-04
    • 2013-07-27
    • 2018-11-13
    • 2013-01-06
    • 2018-06-30
    相关资源
    最近更新 更多