我正在尝试在 CUDA 中编写一个程序,该程序将在主机端使用 Boost 的单生产者/单消费者队列,但是当我包含 <boost/lockfree/spsc_queue.hpp>
时,我就会遇到编译器错误。 .
此时,我没有在设备上执行任何操作,也没有创建 spsc_queue
目的。当我尝试使用上面的 header 进行编译时,错误就发生了。
最初我使用的是 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 的无锁 spsc_queue 时如何进行编译?我做错了什么?
最佳答案
问题是nvcc
并不像例如那样成熟。 g++
当涉及复杂的 C++ 代码(例如 Boost)时。一些 Boost 库可以与 nvcc 配合使用,其他库则无法编译; boost::lockfree
似乎属于后一组。
一个可能的解决方案是拆分主机和设备代码,并编译所有主机代码,其中包括 nvcc
无法使用 g++
理解的 header 。
关于c++ - 使用 Boost 的无锁 spsc_queue 时如何编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31796269/