使用英特尔线程构建模块编译:错误操作数到?:

Posted

技术标签:

【中文标题】使用英特尔线程构建模块编译:错误操作数到?:【英文标题】:Compiling with Intel Threading Building Blocks: error operands to ?: 【发布时间】:2017-12-06 11:34:15 【问题描述】:

目前,我尝试编译依赖于线程构建块的 OpenVDB。我收到以下错误:

In file included from /usr/include/tbb/enumerable_thread_specific.h:32:0,
             from ../openvdb/tools/Morphology.h:59,
             from ../openvdb/tools/MultiResGrid.h:64,
             from cmd/openvdb_lod/main.cc:32:
/usr/include/tbb/concurrent_vector.h: In member function ‘tbb::concurrent_vector<T, A>::iterator tbb::concurrent_vector<T, A>::grow_by(tbb::concurrent_vector<T, A>::size_type)’:
/usr/include/tbb/concurrent_vector.h:667:38: error: operands to ?: have different types ‘tbb::internal::concurrent_vector_base_v3::size_type aka long unsigned int’ and ‘tbb::atomic<long unsigned int>’
     return iterator(*this, delta ? internal_grow_by( delta, sizeof(T), &initialize_array, NULL ) : my_early_size);
                            ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/tbb/concurrent_vector.h:667:38: note:   and each type can be converted to the other
/usr/include/tbb/concurrent_vector.h: In member function ‘tbb::concurrent_vector<T, A>::iterator tbb::concurrent_vector<T, A>::grow_by(tbb::concurrent_vector<T, A>::size_type, tbb::concurrent_vector<T, A>::const_reference)’:
/usr/include/tbb/concurrent_vector.h:680:38: error: operands to ?: have different types ‘tbb::internal::concurrent_vector_base_v3::size_type aka long unsigned int’ and ‘tbb::atomic<long unsigned int>’
     return iterator(*this, delta ? internal_grow_by( delta, sizeof(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size);
                            ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/tbb/concurrent_vector.h:680:38: note:   and each type can be converted to the other
make: *** [vdb_lod] Error 1

简而言之,作为第二个和第三个参数,?: 运算符获取一个基类型,并且将相同的基类型包装在 tbb::atomic 中,编译器不知道使用哪种类型作为返回值。

不用说,我无意更改该源代码。由于它们是成熟的产品,因此可以肯定地说我在编译时做错了。

TBB 库文件似乎是用相当旧版本的 GCC 构建的,即 4.7。本来以为问题可能是我用的GCC 7.2.0,所以我尝试了不同的版本,比如GCC 4.8.5,但是错误依旧。

我没有特别尝试过 4.7,因为我在一家没有管理员权限的公司工作,并且我尽量避免在本地安装 GCC。特别是因为我不知道 GCC 是否是这里的问题。

有人知道解决办法吗?

编辑:https://software.intel.com/en-us/forums/intel-threading-building-blocks/topic/417161 似乎是同样的问题,英特尔的一名员工注意到它在那里进行了更改。然而,那篇文章是 2013 年的,由于人们在这两者之间使用 TBB,所以总体上我肯定做一些不同的事情。

【问题讨论】:

“由于它们是成熟的产品,可以肯定地说我在编译时做错了。” ——哦,青春的轻信。 :-D 这不是第一次新的编译器版本不会让已建立的代码库中的老问题暴露出来...... 【参考方案1】:

看起来使用的是过时的 TBB 版本。 见the similar question on the TBB forum。

【讨论】:

以上是关于使用英特尔线程构建模块编译:错误操作数到?:的主要内容,如果未能解决你的问题,请参考以下文章

C++ 并行化库:OpenMP 与线程构建块 [关闭]

线程池对英特尔线程构建块有用吗?

具有140多个模块的英特尔Fortran 11.1长编译时间

OpenCL(英特尔平台)显示构建错误(-11),状态为 0

编译使用带有gfortran的英特尔MKL模块的代码

任务是使用 p 线程并行化矩阵乘法并使用英特尔 ISPC 编译器进行矢量化