CUDA错误C2059:语法错误:'<'

时间:2015-11-06 15:25:36

标签: c++ cuda

编译代码时遇到麻烦。

首先,我必须说明一些事情:

  1. 在我的GTX650Ti GPU中运行其他更简单的CUDA代码没有任何问题。 Thrust exception: "thrust::system::system_error at memory location 0x00000000"

  2. 我一直在使用多种方法在一个班级工作,由于一些未知的原因,这个程序导致我错误: 错误C2059:语法错误:'<'

  3. 这是代码的一部分:

    __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
    

1 个答案:

答案 0 :(得分:0)

我已经发现为什么我的代码会产生错误!

这就是问题:我定义了一个名为 foo.cuh 的头文件。我只在那里定义了类foo,但所有方法都是在一个名为 foo.cu (源文件)的separeted文件中定义的。

当我复制所有 foo.cu 文件并在类定义后将其粘贴到头文件中时,此错误消失了!!!

我认为CUDA不支持使用源文件在单独的文件中定义类方法。我的意思是NVCC编译器不处理源文件;而不是C ++编译器尝试编译它们。

您怎么看?