3

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

4

1 に答える 1

4

http://goparallel.sourceforge.net/compiling-tbb-programs-and-examples-on-linux-ubuntu/にある-ltbbコンパイラフラグを使用して解決しました。とにかく、助けてくれてみんなありがとう:)

于 2013-03-18T00:22:04.650 に答える