我正在尝试在CUDA中编写一个程序,该程序将在主机端使用Boost的单生成器/单用户队列,但是只要包含<boost/lockfree/spsc_queue.hpp>
,我就会遇到编译器错误。
此时,我在设备上什么也没做,也没有创建spsc_queue
对象。一旦我尝试使用上面的标题进行编译,就会发生错误。
最初我使用Boost 1.54,使用GCC 4.8.4进行编译,并使用作为CUDA 7.0 makefile一部分的所有标志以及以下自定义标志:-Xcompiler -fopenmp -lgomp -std=c++11 -lpthread
。这些是变量MYFLAGS,如下所示:
main.o: main.cu
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -c $(MYFLAGS) main.cu.
然后在链接步骤中,我有
$(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -O2 $(MYFLAGS) -o runnable $(OBJECTS) $(LIBRARIES).
我一收到标题,就收到了这个错误:
/usr/include/boost/utility/detail/result_of_iterate.hpp:135:75: error:
invalid use of qualified-name std::allocator_traits<_Alloc>::propagate_on_container_swap’
我搜索了Boost中可能存在的错误,我发现了this one。不幸的是,这根本不是我所拥有的问题。
我升级到Boost 1.58,现在我收到了一个不同的错误:
boost_1_58_0/boost/lockfree/spsc_queue.hpp(352): error: too few arguments in function call.
spsc_queue.hpp
中的问题代码是“重置”例程的一部分,但同样,我还没有声明对象。
void reset(void)
{
if ( !boost::has_trivial_destructor<T>::value ) {
// make sure to call all destructors!
T dummy_element;
while (pop(dummy_element))
{}
} else {
write_index_.store(0, memory_order_relaxed);
read_index_.store(0, memory_order_release);
}
}
因此,我的问题是:在使用Boost的lockfree spsc_queue时如何编译?我做错了什么?
答案 0 :(得分:2)
问题在于nvcc
并不像g++
涉及复杂的C ++代码,如Boost。一些Boost库使用nvcc
,其他库无法编译; boost::lockfree
似乎属于后一组。
一种可能的解决方案是拆分主机和设备代码,并编译包含nvcc
无法理解的标头g++
的所有主机代码。