1

cutil.h ヘッダーが CUDA サンプルから削除されたため、helper_cuda.h、helper_functions.h などの新しいヘッダーがいくつか導入されました。

私が使用する主なキーワードの 1 つは CUDA_CHECK_ERROR で、これは checkCudaErrors に置き換えられたと思います。

私のコードのほとんどで、マクロはコンパイルされ、うまく機能します。ただし、check(..)という名前の関数を持つクラスで使用すると、checkCudaErrors関数でコンパイルエラーが発生します。

次に例を示します。

#include <stdio.h>

#include <cuda_runtime.h>
#include <helper_cuda.h>
#include <helper_functions.h>

template<typename T>
class Trivial {

public:

    void check()
    {

    }

    void initialize() 
    {
        checkCudaErrors(cudaMalloc(NULL, 1));
    }

    T val;

};

int main(int argc, char **argv)
{

    Trivial<int> tt;

    tt.initialize();

    return 0;
}

コンパイルの結果: (GCC 4.5 でコンパイルした場合も同じエラーが表示されます!)

1>------ Build started: Project: ZERO_CHECK, Configuration: Release x64 ------
2>------ Build started: Project: massivecc, Configuration: Release x64 ------
2>  trivial_main.cpp
2>..\src\trivial_main.cpp(19): error C2660: 'Trivial<T>::check' : function does not     take 4 arguments
2>          with
2>          [
2>              T=int
2>          ]
2>          ..\src\trivial_main.cpp(18) : while compiling class template member         function 'void Trivial<T>::initialize(void)'
2>          with
2>          [
2>              T=int
2>          ]
2>          ..\src\trivial_main.cpp(29) : see reference to class template         instantiation 'Trivial<T>' being compiled
2>          with
2>          [
2>              T=int
2>          ]
3>------ Skipped Build: Project: ALL_BUILD, Configuration: Release x64 ------
3>Project not selected to build for this solution configuration 
========== Build: 1 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========

テンプレート パラメータを削除すると、同じエラーが発生します。

4

2 に答える 2

0

クラスをコンパイルできるようにするには、check(..) 関数の定義を helper_functions.h からクラスのヘッダーにコピーする必要がありました。

#include <stdio.h>    
#include <cuda_runtime.h>
#include <helper_cuda.h>
#include <helper_functions.h>    
class Trivial {    
public:    
    template< typename T >
    bool check(T result, char const *const func, const char *const file, int const line)
    {
        if (result) {
            fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n",
            file, line, static_cast<unsigned int>(result), _cudaGetErrorEnum(result), func);
            return true;
        } else {
            return false;
        }
    }

    void check() {  }

    void initialize() 
    {
        checkCudaErrors(cudaMalloc(NULL, 1));
    }
};

int main(int argc, char **argv)
{
    Trivial tt;
    tt.initialize();    
    return 0;
}

したがって、これで主に問題が解決し、コードが正常にコンパイルされました。

于 2013-01-14T08:30:03.107 に答える
0

helper_cuda.h の 680 行目にあるソース コードを参照してください。

https://github.com/pathscale/nvidia_sdk_samples/blob/master/vectorAdd/common/inc/helper_cuda.h

checkCudaErrors が #define checkCudaErrors(val) チェック ( (val), #val, FILE , LINE ) を宣言していることがわかります。これは、単一の引数を取り、config に基づいて他の 3 つの引数で check を呼び出します。680 行目でも定義されていることに注意してください。

あなたの場合、引数を取らないチェックを定義します。宣言と定義が異なる場合、複数の定義がある場合。

于 2015-08-09T21:17:24.307 に答える