如何使用Boost的lockfree spsc_queue进行编译?

时间:2015-08-03 20:33:10

标签: c++ c++11 boost cuda

我正在尝试在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 个答案:

答案 0 :(得分:2)

问题在于nvcc并不像g++涉及复杂的C ++代码,如Boost。一些Boost库使用nvcc,其他库无法编译; boost::lockfree似乎属于后一组。

一种可能的解决方案是拆分主机和设备代码,并编译包含nvcc无法理解的标头g++的所有主机代码。