gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:08 32 4
gpt4 key购买 nike

我正在尝试在 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 不像 e.g. 那样成熟g++ 涉及复杂的 C++ 代码,例如 Boost。一些 Boost 库与 nvcc 一起工作,其他的则无法编译; boost::lockfree 似乎属于后一组。

一个可能的解决方案是拆分主机和设备代码,并编译所有包含头文件的主机代码 nvcc 不能用 g++ 理解。

关于c++ - 如何在使用 Boost 的无锁 spsc_queue 时进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31796269/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com