编译代码时遇到麻烦。
首先,我必须说明一些事情:
在我的GTX650Ti GPU中运行其他更简单的CUDA代码没有任何问题。 Thrust exception: "thrust::system::system_error at memory location 0x00000000"
我一直在使用多种方法在一个班级工作,由于一些未知的原因,这个程序导致我错误: 错误C2059:语法错误:'<'
这是代码的一部分:
__global__ void linearSpaceKernel(double *result, double base, double delta, unsigned int size)
{
unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < size)
result[i] = base + double(i) * delta;
cudaThreadSynchronize();
}
void foo::setRange(const double &lower, const double &upper, const unsigned int &samples)
{
vector<double> result(samples);
double dx = (upper - lower) / (samples - 1);
if (isCUDA)
{
device_vector<double> dev_result(samples);
linearSpaceKernel<<<1, samples>>>(raw_pointer_cast(dev_result.data()), lower, dx, samples);
thrust::copy(dev_result.begin(), dev_result.end(), result.begin());
}
else
{
double summation = lower;
for (unsigned int i = 0; i < samples; i++)
{
result[i] = summation;
summation += dx;
}
}
dis = result;
}
我省略了CUDA错误函数和其余代码,以保持我的代码简洁明了。
我必须明确 setRange 是 foo 的类成员函数,它调用内核 linearSpaceVector() 即可。此类提供名为 isCUDA 的布尔值,用于让用户决定是在主机中还是在设备中执行执行。 最后,两个执行选项都会更新向量 dis ,这是一个类成员向量。
主要功能在 fooTest.cu 中定义如下:
#include "foo.cuh"
int main()
{
CUDAinit();
foo A;
A.isCUDA = true;
A.setRange(0, 1, 100);
cin.get();
}
输出如下:
1>------ Build started: Project: fs, Configuration: Debug Win32 ------
1> Compiling CUDA source file ..\..\..\..\..\OneDrive\Documentos\Cátedras CONACyT\UTM\Research\FLS\Programs\fsTest.cu...
1>
1> C:\Users\Arturo\Documents\Visual Studio 2013\Projects\fs\fs>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include" -G --keep-dir Debug -maxrregcount=0 --machine 32 --compile -cudart static -g -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o Debug\fsTest.cu.obj "C:\Users\Arturo\OneDrive\Documentos\Cátedras CONACyT\UTM\Research\FLS\Programs\fsTest.cu"
1> fsTest.cu
1> fs.cu
1> c:\program files\nvidia gpu computing toolkit\cuda\v7.5\include\thrust\system\detail\error_category.inl(102): warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h(168) : see declaration of 'strerror'
1> c:\program files\nvidia gpu computing toolkit\cuda\v7.5\include\thrust\system\cuda\detail\bulk\detail\pointer_traits.hpp(55): warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning)
1> c:\users\arturo\onedrive\documentos\cátedras conacyt\utm\research\fls\programs\fs.cu(332): error C2059: syntax error : '<'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
错误列为:
3 Error C2059: syntax error : '<' c:\users\arturo\onedrive\documentos\cátedras conacyt\utm\research\fls\programs\fs.cu 332 1 fs
4 IntelliSense: expected an expression c:\Users\Arturo\OneDrive\Documentos\Cátedras CONACyT\UTM\Research\FLS\Programs\fs.cu 332 23 fs
Warning 2 warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning) c:\program files\nvidia gpu computing toolkit\cuda\v7.5\include\thrust\system\cuda\detail\bulk\detail\pointer_traits.hpp 55 1 fs
Warning 1 warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files\nvidia gpu computing toolkit\cuda\v7.5\include\thrust\system\detail\error_category.inl 102 1 fs
答案 0 :(得分:0)
我已经发现为什么我的代码会产生错误!
这就是问题:我定义了一个名为 foo.cuh 的头文件。我只在那里定义了类foo,但所有方法都是在一个名为 foo.cu (源文件)的separeted文件中定义的。
当我复制所有 foo.cu 文件并在类定义后将其粘贴到头文件中时,此错误消失了!!!
我认为CUDA不支持使用源文件在单独的文件中定义类方法。我的意思是NVCC编译器不处理源文件;而不是C ++编译器尝试编译它们。
您怎么看?