c++ - 使用 Boost 的无锁 spsc_queue 时如何编译?

标签 c++ c++11 boost cuda

我正在尝试在 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/

相关文章:

c++ - 迭代 vector 并将迭代器实际指向的对象添加为 map 中的键

c++ - 当我尝试使用 sstream 和 facet 将 Boost Time_duration 转换为字符串时,我没有得到所需的格式

c++ - 如何使用 std::bind 做到这一点?

c++ - 在 std::accumulate 中使用变异函数

c++ - qt 5.2.1 中缺少 header

c++ - 为什么不调用 move 构造函数?

c++ - std::optional 枚举的比较运算符

c++ - 如何获得指向编译器选择的重载函数的函数指针?

c++ - 如何将秒转换为hh :mm:ss.毫秒格式c++?

c++ - 将可选的隐式转换为 bool 值?