2016-08-19 31 views
0

私はCUDAを使用し始めています。私のプロジェクトには推力があるので、まだいくつかの面で新しいです。私は次の問題に遭遇しました。リンク中のCUDA多重定義エラー

私は、使用することができる構造体を持つ共通のヘッダーファイルで使用したい.cuファイルを分離する必要があります。今

////////secondcufile.cu 
#ifndef secondcufile_cu 
#define secondcufile_cu 
#include "Global.h" 

template<typename T> 
double getMean(const T& vec) 
{ 
    uint64_t spaceNeededOnGPU = vec.size() * sizeof (T); 
    uint64_t maxSpace = glParam.spaceToUse; 

    //Some code to make sure tops maxSpace bytes on GPU 
    double sum = thrust::reduce(std::begin(vec), std::end(vec)); 
    return sum/vec.size(); 
} 

template double getMean(const QVector<float>& vec); 
#endif 

私が取得エラー:二.cuファイルは次のようになります

////////firstcufile.cu 
#ifndef firstcufile_cu 
#define firstcufile_cu 
#include "Global.h" 

template<typename T> 
QVector<T> GPUcalculateNormSq(const QVector<T>& real, const QVector<T>& imag) 
{ 
    QVector<T> result (real.size()); 
    uint64_t maxSpace = glParam.spaceToUse; 

    //Some Code to use thrust and using tops maxSpace bytes. 

    return result; 
} 

template QVector<float> GPUcalculateNormSq(const QVector<float>& real, const QVector<float>& imag); 
template QVector<double> GPUcalculateNormSq(const QVector<double>& real, const QVector<double>& imag); 

#endif 

:まず.cuファイルは次のようになります

////////Global.h 
#ifndef global_h 
#define global_h 
struct globalParam 
{ 
    uint64_t spaceToUse; 
    globalParams() : spaceToUse(1024*1024*1024) {} 
}; 

globalParam glParam; 
#endif 

:それはこのようなものですは:

secondcufilecuda_d.o:(.bss+0x18): multiple definition of `glParam' 
firstcufilecuda_d.o:(.bss+0x18): first defined here 

上記の機能似たように見えますが、できるだけシンプルにしようとしたからです。単一の.cuファイルにすべてを書き込むことは可能ですが、可能であれば分割したいと思います。

私はリンカに何が間違っていますか? Qt Creatorプロジェクト内でコンパイルとリンクを行っています。 nvccコンパイラの使い方を知るために、.proファイルから私の行が必要かどうかを教えてください。

答えて

1

Global.hが複数回含まれており、その都度含まれています:globalParam glParam;です。これは、前方宣言(つまり、型シグネチャだけではありません)ではなく、globalParam構造体の実際のインスタンス化に相当します。次に、glParamという名前の2つの変数(それぞれ#includeの別々のGlobal.hに対応)があり、複数の定義エラーが発生します。

クイックフィックス:グローバル変数を共有したい場合は、externを使用してみてください(リンカはそれが単なる「外部」シンボルへの参照であることを認識しています)。

改善点:コードをリファクタリングして、関数の引数として参照またはポインタを介してグローバルパラメータを渡すことを検討してください。そうすれば、ヘッダー内に変数glParamを宣言する必要はなく、問題全体をステップ実行し、コードをより理解しやすくする/取引をバーゲンにすることができます。

関連する問題