在现有 C 项目中使用 CUDA Thrust:编译错误
Using CUDA Thrust in existing C project: Compilation Error
我正在尝试将以下基本代码 (radix_sort_128x.cu
) 合并到现有的 C
项目中:
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/sort.h>
#include "cuda.h"
extern "C" {
#include "radix_sort_128x.h"
}
__host__ __device__ bool operator<(const mm128_t & lhs, const mm128_t & rhs)
{ return lhs.x < rhs.x; }
extern "C"
void radix_sort_128x_kernel(mm128_t* list, size_t n) {
thrust::device_vector<mm128_t> list_d(list, list + n);
thrust::sort(list_d.begin(), list_d.end());
thrust::copy(list_d.begin(), list_d.end(), list);
}
但是,当我尝试使用 NVCC (nvcc -c -o radix_sort_128x.o radix_sort_128x.cu
) 编译此文件时,出现以下错误:
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc: In instantiation of ‘static std::basic_string<_CharT, _Traits, _Alloc>::_Rep* std::basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_create(std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’:
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc:578:28: required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&, std::forward_iterator_tag) [with _FwdIterator = const char16_t*; _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:5052:20: required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, std::__false_type) [with _InIterator = const char16_t*; _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:5073:24: required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&) [with _InIterator = const char16_t*; _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc:656:134: required from ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:6725:95: required from here
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc:1067:1: error: cannot call member function ‘void std::basic_string<_CharT, _Traits, _Alloc>::_Rep::_M_set_sharable() [with _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’ without object __p->_M_set_sharable();
似乎是我的任何 #include
语句(使用 Thrust headers)导致了这个错误,并且可能是由于 C 与 C++ 的冲突。知道如何解决这个问题吗?我试过将整个项目编译为 C++,但这并没有解决任何问题。提前致谢!
我的 CUDA 版本 (10.1) 与 GCC 版本 (8.3.1) 不兼容。我曾尝试将 GCC 降级到 4.3.5,但没有意识到 /usr/local/cuda/include
中的符号 link 将 CUDA 指向 devtoolset-8
GCC 8.3.1 版,我的降级尝试失败了失败。
我正在尝试将以下基本代码 (radix_sort_128x.cu
) 合并到现有的 C
项目中:
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/sort.h>
#include "cuda.h"
extern "C" {
#include "radix_sort_128x.h"
}
__host__ __device__ bool operator<(const mm128_t & lhs, const mm128_t & rhs)
{ return lhs.x < rhs.x; }
extern "C"
void radix_sort_128x_kernel(mm128_t* list, size_t n) {
thrust::device_vector<mm128_t> list_d(list, list + n);
thrust::sort(list_d.begin(), list_d.end());
thrust::copy(list_d.begin(), list_d.end(), list);
}
但是,当我尝试使用 NVCC (nvcc -c -o radix_sort_128x.o radix_sort_128x.cu
) 编译此文件时,出现以下错误:
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc: In instantiation of ‘static std::basic_string<_CharT, _Traits, _Alloc>::_Rep* std::basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_create(std::basic_string<_CharT, _Traits, _Alloc>::size_type, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’:
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc:578:28: required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&, std::forward_iterator_tag) [with _FwdIterator = const char16_t*; _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:5052:20: required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, std::__false_type) [with _InIterator = const char16_t*; _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:5073:24: required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&) [with _InIterator = const char16_t*; _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc:656:134: required from ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, std::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:6725:95: required from here
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.tcc:1067:1: error: cannot call member function ‘void std::basic_string<_CharT, _Traits, _Alloc>::_Rep::_M_set_sharable() [with _CharT = char16_t; _Traits = std::char_traits<char16_t>; _Alloc = std::allocator<char16_t>]’ without object __p->_M_set_sharable();
似乎是我的任何 #include
语句(使用 Thrust headers)导致了这个错误,并且可能是由于 C 与 C++ 的冲突。知道如何解决这个问题吗?我试过将整个项目编译为 C++,但这并没有解决任何问题。提前致谢!
我的 CUDA 版本 (10.1) 与 GCC 版本 (8.3.1) 不兼容。我曾尝试将 GCC 降级到 4.3.5,但没有意识到 /usr/local/cuda/include
中的符号 link 将 CUDA 指向 devtoolset-8
GCC 8.3.1 版,我的降级尝试失败了失败。