使用 Boost 的 lockfree spsc_queue 时如何编译?
Posted
技术标签:
【中文标题】使用 Boost 的 lockfree spsc_queue 时如何编译?【英文标题】:How do I compile while using Boost's lockfree spsc_queue? 【发布时间】:2015-08-03 20:33:10 【问题描述】:我正在尝试在 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 时进行编译?我做错了什么?
【问题讨论】:
【参考方案1】:问题是nvcc
不像 e.g. 那样成熟。 g++
涉及复杂的 C++ 代码,例如 Boost。一些 Boost 库与 nvcc
一起工作,其他库无法编译; boost::lockfree
似乎属于后者。
一种可能的解决方案是拆分主机和设备代码,并编译所有主机代码,其中包括 nvcc
不理解 g++
的标头。
【讨论】:
谢谢!我会试试看。以上是关于使用 Boost 的 lockfree spsc_queue 时如何编译?的主要内容,如果未能解决你的问题,请参考以下文章
使用 sizeof(boost::lockfree::queue<std::string>) 时出错
Boost lockfree deque 生产者与消费者多对多线程应用
evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试
evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试