TBBとラムダ式を使用して基本的な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:警告:ラムダ式は-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:注:template 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:注:template 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:注:template 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:注:template void tbb :: parallel_for(const Range&、const Body&、tbb ::アフィニティ_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:注:template 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:注:template 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:注:template void tbb :: parallel_for(const Range&、const Body&、tbb ::アフィニティ_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:注:パラメーター'Index'('tbb ::blocked_range'および'ParallelApplyFoo(int *、size_t)::&)>')の競合するタイプを推定しました main.cpp:10:0からインクルードされたファイル: /usr/include/tbb/parallel_for.h:235:6:注:template 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:注:パラメーター'Index'('tbb ::blocked_range'および'ParallelApplyFoo(int *、size_t)::&)>')の競合するタイプを推定しました main.cpp:10:0からインクルードされたファイル: /usr/include/tbb/parallel_for.h:228:6:注:template void tbb :: strict_ppl :: parallel_for(Index、Index、const Function&) /usr/include/tbb/parallel_for.h:228:6:注:テンプレート引数の推定/置換に失敗しました: main.cpp:26:5:注:パラメーター'Index'('tbb ::blocked_range'および'ParallelApplyFoo(int *、size_t)::&)>')の競合するタイプを推定しました main.cpp:10:0からインクルードされたファイル: /usr/include/tbb/parallel_for.h:215:6:注:template void tbb :: strict_ppl :: parallel_for(Index、Index、Index、const Function&) /usr/include/tbb/parallel_for.h:215:6:注:テンプレート引数の推定/置換に失敗しました: main.cpp:26:5:注:パラメーター'Index'('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): `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} const&)': main.cpp:(。text+0x9d): `tbb :: task_group_context :: init()'への未定義の参照 main.cpp:(。text+0xb5): `tbb :: internal :: alllocate_root_with_context_proxy :: alllocate(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): `tbb :: internal :: alllocate_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): `tbb :: internal :: alllocate_continuation_proxy :: alllocate(unsigned int)const'への未定義の参照 main.cpp:(。text+0x27b): `tbb :: internal :: alllocate_child_proxy :: alllocate(unsigned int)const'への未定義の参照 main.cpp:(。text+0x313): `tbb :: internal :: alllocate_continuation_proxy :: alllocate(unsigned int)const'への未定義の参照 main.cpp:(。text+0x33d): `tbb :: internal :: alllocate_child_proxy :: alllocate(unsigned int)const'への未定義の参照 main.cpp:(。text+0x4b6): `tbb :: internal :: alllocate_continuation_proxy :: alllocate(unsigned int)const'への未定義の参照 main.cpp:(。text+0x4e8): `tbb :: internal :: alllocate_child_proxy :: alllocate(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): `vtable for tbb::task'への未定義の参照 build / Release / GNU-Linux-x86 / main.o:関数内 `tbb :: interface6 :: internal :: signal_task ::〜signal_task()': main.cpp:(。text._ZN3tbb10interface68internal11signal_taskD0Ev [_ZN3tbb10interface68internal11signal_taskD0Ev] + 0x6): `vtable for tbb::task'への未定義の参照 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): `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): `typeinfo for tbb ::task'への未定義の参照 build / Release / GNU-Linux-x86 / main.o:(。rodata._ZTIN3tbb10interface68internal9flag_taskE [_ZTIN3tbb10interface68internal9flag_taskE] + 0x8): `typeinfo for tbb ::task'への未定義の参照
私はFedora18を使用しています(もちろんtbbおよびtbb-develパッケージがインストールされています)。
誰かアイデアをお願いします?コードはここからコピーされます:http ://software.intel.com/en-us/blogs/2009/08/03/parallel_for-is-easier-with-lambdas-intel-threading-building-blocks