使用 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::函数队列?

Boost lockfree deque 生产者与消费者多对多线程应用

evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试

evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试

boost::lockfree::queue多线程读写实例