0

リンクされた質問に似ています

「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_20_atomic_functions の代わりに sm_11_atomic_functions.h のアトミック関数を使用するのはなぜですか?
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 ツールキットが正しくインストールされ、すべてのパス (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
    } 
};
于 2013-03-19T07:35:23.080 に答える