3

我尝试使用 TBB 和 lambda 表达式编写一个基本的 C++ 程序,但我无法编译它。

#include <iostream>
#include <cstdlib>
#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>

using namespace std;
using namespace tbb;

void Foo(int number) {
    cout<<number<<endl;
}

void ParallelApplyFoo(int* a, size_t n) {
    parallel_for(blocked_range<size_t > (0, n),
            [ = ](const blocked_range<size_t>& r){
        for (size_t i = r.begin(); i != r.end(); ++i)
                Foo(a[i]);
        }
    );
}

int main(int argc, char** argv) {
    int num = 10;
    int* a = new int[num];
    for(int i = 0; i < num; i++)
        a[i] = i;
    ParallelApplyFoo(a,num);
    return 0;
}

和编译器消息:

main.cpp:在函数'void ParallelApplyFoo(int *,size_t)'中:
main.cpp:25:9:警告:lambda 表达式仅适用于 -std=c++11 或 -std=gnu++11 [默认启用]
main.cpp:26:5: 错误: 没有匹配函数调用'parallel_for(tbb::blocked_range, ParallelApplyFoo(int*, size_t)::&)>)'
main.cpp:26:5: 注意:候选人是:
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:161:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&)
main.cpp:26:5: 错误:'template void tbb::parallel_for(const Range&, const Body&)' 的模板参数使用本地类型 'ParallelApplyFoo(int*, size_t)::&)>'
main.cpp:26:5: 错误: 试图实例化'template void tbb::parallel_for(const Range&, const Body&)'
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:168:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&, const tbb::simple_partitioner&)
/usr/include/tbb/parallel_for.h:168:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要 3 个参数,提供 2 个
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:175:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&, const tbb::auto_partitioner&)
/usr/include/tbb/parallel_for.h:175:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要 3 个参数,提供 2 个
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:182:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&, tbb::affinity_partitioner&)
/usr/include/tbb/parallel_for.h:182:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要 3 个参数,提供 2 个
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:190:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&, const tbb::simple_partitioner&, tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:190:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要 4 个参数,提供 2 个
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:197:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&, const tbb::auto_partitioner&, tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:197:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要 4 个参数,提供 2 个
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:204:6: 注意:模板 void tbb::parallel_for(const Range&, const Body&, tbb::affinity_partitioner&, tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:204:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要 4 个参数,提供 2 个
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:248:6: 注意:模板 void tbb::strict_ppl::parallel_for(Index, Index, const Function&, tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:248:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推断出参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int*, size_t)::&)>”)
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:235:6: 注意:模板 void tbb::strict_ppl::parallel_for(Index, Index, Index, const Function&, tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:235:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推断出参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int*, size_t)::&)>”)
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:228:6: 注意:模板 void tbb::strict_ppl::parallel_for(Index, Index, const Function&)
/usr/include/tbb/parallel_for.h:228:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推断出参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int*, size_t)::&)>”)
在 main.cpp:10:0 包含的文件中:
/usr/include/tbb/parallel_for.h:215:6: 注意:模板 void tbb::strict_ppl::parallel_for(Index, Index, Index, const Function&)
/usr/include/tbb/parallel_for.h:215:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推断出参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int*, size_t)::&)>”)
gmake[2]: *** [build/Release/GNU-Linux-x86/main.o] 错误 1

我尝试了编译器标志“-std=c++11”和“-std=gnu++11”,然后输出:

g++ -std=gnu++11 -o dist/Release/GNU-Linux-x86/test build/Release/GNU-Linux-x86/main.o  
build/Release/GNU-Linux-x86/main.o: 在函数 `tbb::interface6::internal::start_for, ParallelApplyFoo(int*, unsigned int)::{lambda(tbb::blocked_range const&)#1} , tbb::auto_partitioner>::~start_for()':
main.cpp:(.text+0x6): 未定义对 `vtable for tbb::task' 的引用
build/Release/GNU-Linux-x86/main.o: 在函数 `tbb::interface6::internal::start_for, ParallelApplyFoo(int*, unsigned int)::{lambda(tbb::blocked_range const&)#1} , tbb::auto_partitioner>::~start_for()':
main.cpp:(.text+0x26): undefined reference to `vtable for tbb::task'
build/Release/GNU-Linux-x86/main.o: 在函数 `tbb::interface6::internal::start_for, ParallelApplyFoo(int*, unsigned int)::{lambda(tbb::blocked_range const&)#1} , tbb::auto_partitioner>::run(tbb::blocked_range const&, {lambda(tbb::blocked_range const&)#1} const&, ParallelApplyFoo(int*, unsigned int)::{lambda(tbb::blocked_range const&)# 1} 常量&)':
main.cpp:(.text+0x9d): 未定义对 `tbb::task_group_context::init()' 的引用
main.cpp:(.text+0xb5): undefined reference to `tbb::internal::allocate_root_with_context_proxy::allocate(unsigned int) const'
main.cpp:(.text+0xe1): 未定义引用 `tbb::internal::get_initial_auto_partitioner_divisor()'
main.cpp:(.text+0x107): 未定义引用 `tbb::task_group_context::~task_group_context()'
main.cpp:(.text+0x116): 未定义对 `tbb::task_group_context::~task_group_context()' 的引用
main.cpp:(.text+0x12a): 未定义对 `vtable for tbb::task' 的引用
main.cpp:(.text+0x138): undefined reference to `tbb::internal::allocate_root_with_context_proxy::free(tbb::task&) const'
build/Release/GNU-Linux-x86/main.o: 在函数 `tbb::interface6::internal::start_for, ParallelApplyFoo(int*, unsigned int)::{lambda(tbb::blocked_range const&)#1} , tbb::auto_partitioner>::execute()':
main.cpp:(.text+0x251): undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned int) const'
main.cpp:(.text+0x27b): 未定义引用`tbb::internal::allocate_child_proxy::allocate(unsigned int) const'
main.cpp:(.text+0x313): undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned int) const'
main.cpp:(.text+0x33d): undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned int) const'
main.cpp:(.text+0x4b6): undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned int) const'
main.cpp:(.text+0x4e8): undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned int) const'
main.cpp:(.text+0x585): 未定义引用 `tbb::task_group_context::is_group_execution_cancelled() const'
build/Release/GNU-Linux-x86/main.o:在函数`tbb::interface6::internal::flag_task::~flag_task()'中:
main.cpp:(.text._ZN3tbb10interface68internal9flag_taskD2Ev[_ZN3tbb10interface68internal9flag_taskD5Ev]+0x6): 未定义对 `vtable for tbb::task' 的引用
build/Release/GNU-Linux-x86/main.o:在函数“tbb::interface6::internal::signal_task::~signal_task()”中:
main.cpp:(.text._ZN3tbb10interface68internal11signal_taskD2Ev[_ZN3tbb10interface68internal11signal_taskD5Ev]+0x6):未定义对“tbb::task vtable”的引用
build/Release/GNU-Linux-x86/main.o:在函数“tbb::interface6::internal::signal_task::~signal_task()”中:
main.cpp:(.text._ZN3tbb10interface68internal11signal_taskD0Ev[_ZN3tbb10interface68internal11signal_taskD0Ev]+0x6):未定义对“tbb::task vtable”的引用
build/Release/GNU-Linux-x86/main.o:在函数`tbb::interface6::internal::flag_task::~flag_task()'中:
main.cpp:(.text._ZN3tbb10interface68internal9flag_taskD0Ev[_ZN3tbb10interface68internal9flag_taskD0Ev]+0x6): 未定义对 `vtable for tbb::task' 的引用
build/Release/GNU-Linux-x86/main.o:(.rodata+0x20): undefined reference to `typeinfo for tbb::task'
build/Release/GNU-Linux-x86/main.o:(.rodata._ZTVN3tbb10interface68internal11signal_taskE[_ZTVN3tbb10interface68internal11signal_taskE]+0x14): 未定义引用`tbb::task::note_affinity(unsigned short)'
build/Release/GNU-Linux-x86/main.o:(.rodata._ZTVN3tbb10interface68internal9flag_taskE[_ZTVN3tbb10interface68internal9flag_taskE]+0x14): 未定义引用 `tbb::task::note_affinity(unsigned short)'
build/Release/GNU-Linux-x86/main.o:(.rodata._ZTIN3tbb10interface68internal11signal_taskE[_ZTIN3tbb10interface68internal11signal_taskE]+0x8):未定义对“tbb::task 的类型信息”的引用
build/Release/GNU-Linux-x86/main.o:(.rodata._ZTIN3tbb10interface68internal9flag_taskE[_ZTIN3tbb10interface68internal9flag_taskE]+0x8):未定义对“tbb::task 的类型信息”的引用

我正在使用 Fedora 18(当然安装了 tbb 和 tbb-devel 软件包)。

请问有人有什么想法吗?代码从这里复制:http: //software.intel.com/en-us/blogs/2009/08/03/parallel_for-is-easier-with-lambdas-intel-threading-building-blocks

4

1 回答 1

4

使用 -ltbb 编译器标志解决了它,在这里找到:http: //goparallel.sourceforge.net/compiling-tbb-programs-and-examples-on-linux-ubuntu/。无论如何,谢谢大家的帮助:)

于 2013-03-18T00:22:04.650 回答