加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – CMDA的CUDA编译问题

发布时间:2020-12-16 03:21:00 所属栏目:百科 来源:网络整理
导读:我有使用CMake编译我的CUDA代码的问题.我使用CUDA 7,nvcc的版本信息如下: nvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2014 NVIDIA CorporationBuilt on Tue_Dec__9_18:10:46_CST_2014Cuda compilation tools,release 7.0,V7.0.17 我的CMake
我有使用CMake编译我的CUDA代码的问题.我使用CUDA 7,nvcc的版本信息如下:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2014 NVIDIA Corporation
Built on Tue_Dec__9_18:10:46_CST_2014
Cuda compilation tools,release 7.0,V7.0.17

我的CMake文件使用find_cuda宏如下:

find_package(CUDA)
if(CUDA_FOUND)
    list(APPEND CUDA_NVCC_FLAGS "-arch=sm_20;--compiler-options;-std=c++11;-O2;-DVERBOSE")
endif(CUDA_FOUND)

我添加了std = c 11编译器标志后许多帖子建议这是需要的.但是,我得到完全相同的错误有或没有这个标志.

我还添加了以下内容以从nvcc编译标志中删除C 11支持,但是这也不会改变任何东西.

if(CMAKE_COMPILER_IS_GNUCC)
    string(REPLACE "-std=c++11" "" CUDA_HOST_FLAGS "${CUDA_HOST_FLAGS}")
    string(REPLACE "-std=c++0x" "" CUDA_HOST_FLAGS "${CUDA_HOST_FLAGS}")
endif(CMAKE_COMPILER_IS_GNUCC)

我得到的错误如下:

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432): error: identifier "nullptr" is undefined

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432): error: expected
a ";"

/usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h(190): error: 
expected a ";"

/usr/include/c++/4.8/exception(63): error: expected a ";"

/usr/include/c++/4.8/exception(68): error: expected a ";"

/usr/include/c++/4.8/exception(76): error: expected a ";"

/usr/include/c++/4.8/exception(83): error: expected a ";"

/usr/include/c++/4.8/exception(93): error: expected a "{"

/usr/include/c++/4.8/bits/exception_ptr.h(64): error: function 
"std::current_exception" returns incomplete type  
"std::__exception_ptr::exception_ptr"

我正在使用gcc 4.8,但是也会得到与4.7相同的错误.我在cmake 2.8.12.2.

使用CMAKE verbose进行编译为nvcc编译提供以下标志:

/usr/local/cuda-7.0/bin/nvcc /home/xargon/Dropbox/code/gpu-mosaicing
/src/gpu/kernels/bgra_2_gray.cu -c -o /home/xargon/code/mosaicing_bin
/gpu/kernels/CMakeFiles/kernels.dir//./kernels_generated_bgra_2_gray.cu.o 
-ccbin /usr/bin/cc -m64 -DUSE_CUDA -DUSE_OPENCV -DUSE_QT -Xcompiler,"-std=c++11","-O3","-DNDEBUG" -arch=sm_20 --compiler-options 
-std=c++11 -O2 -DVERBOSE -DNVCC -I/usr/local/cuda-7.0/include -I/usr/local
/include/opencv -I/usr/local/include -I/home/xargon/Dropbox/code/gpu-
mosaicing/src/cpu/gui/qt -I/usr/include -I/home/xargon/Dropbox/code/gpu-
mosaicing/src/cpu/core -I/home/xargon/Dropbox/code/gpu-mosaicing/src/cpu
/datasources -I/home/xargon/Dropbox/code/gpu-mosaicing/src/gpu
/intraoperability -I/home/xargon/Dropbox/code/gpu-mosaicing/src/utils 
-I/usr/local/cuda-7.0/include

解决方法

这对我来说使用CUDA 7,gcc 4.8.2和CMake 3.0.2.

我更新了代码,并添加了一个简单的基于推力的示例,以便清楚地表明您可以在CUDA代码中使用C 11

的CMakeLists.txt

project(cpp11)
find_package(CUDA)
list(APPEND CUDA_NVCC_FLAGS "-arch=sm_20;-std=c++11;-O2;-DVERBOSE")
SET(CUDA_PROPAGATE_HOST_FLAGS OFF)
CUDA_ADD_EXECUTABLE(cpp11 main.cpp test.h test.cu)

test.h

#ifndef TEST_H
#define TEST_H
int run();
#endif

test.cu

#include "test.h"
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
#include <thrust/sequence.h>

template<typename T>
struct Fun
{
        __device__ T operator()(T t1,T t2)
        {
            auto result = t1+t2;
            return result;
        }
};

int run()
{
    const int N = 100;
    thrust::device_vector<int> vec(N);
    thrust::sequence(vec.begin(),vec.end());
    auto op = Fun<int>();
    return thrust::reduce(vec.begin(),vec.end(),op);
}

main.cpp中

#include <iostream>
#include "test.h"

int main()
{
    std::cout << run() << std::endl;
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读