我开始使用CUDA并推动我的一个项目,所以我对其中一些方面仍然是新手。我遇到了以下问题。
我必须将我想要使用的.cu文件与一个公共头文件分开,该文件具有两个都能够使用的结构。它是这样的:
////////Global.h
#ifndef global_h
#define global_h
struct globalParam
{
uint64_t spaceToUse;
globalParams() : spaceToUse(1024*1024*1024) {}
};
globalParam glParam;
#endif
First .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文件如下所示:
////////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
现在我得到的错误是:
secondcufilecuda_d.o:(.bss+0x18): multiple definition of `glParam'
firstcufilecuda_d.o:(.bss+0x18): first defined here
上面的函数看似相似,但那是因为我试图让它们变得尽可能简单。可以将所有内容写入单个.cu文件中,但如果可能的话我想将其拆分。
我对链接器做错了什么?我正在Qt Creator项目中编译和链接。如果您需要.pro文件中的行来了解我如何使用nvcc编译器,请告诉我。
答案 0 :(得分:1)
由于Global.h
被多次包含这一事实,每次包含globalParam glParam;
时都会提供:globalParam
。glParam
。这不是前向声明(即不仅仅是类型签名),而是相当于#include
结构的实际实例化。然后,这会导致有两个名为Global.h
的变量(每个变量对应extern
glParam
}并且会给您带来多个定义错误。
快速修复:如果您希望共享全局变量,请尝试使用attributes
(然后链接器知道它只是引用了一个&#39;外部&#39;符号)
更好的修复:考虑重构代码,通过引用或指针将全局参数作为参数传递给函数。这样你甚至不必在标题中声明Car.all.each do |mycar|
another_array << mycar.attributes.slice("model", "engine", "year").values }
end
变量,一边踩着整个问题,让你的代码更容易理解/推理到讨价还价。