1

現時点では、OpenCL のいくつかのプロジェクトに取り組み、OpenCL がどのように機能し、計算を高速化するのにどのように役立つかを理解しようとしています。インターネット上のほとんどのチュートリアルでは、std::vector の代わりに cl::vector を使用することを推奨しています。

なんで?

それらの違いと、cl::vector が OpenCL 開発に適している理由は何ですか?

4

2 に答える 2

1

OpenCL C++ 仕様では、セクション 5 (60 ページ) でこれについて言及しています。

C++ の標準テンプレート ライブラリは、多くの有用なアルゴリズムやコンテナーにすばやくアクセスするための優れたリソースを提供しますが、さまざまなツールチェーンやオペレーティング システム間の互換性の問題などの理由で、多くの場合使用されません。OpenCL C++ API は多くの場所でベクトルと文字列を使用し、デフォルトでは std::vector と std::string を使用しますが、開発者はこれらを含めないようにすることができます。

C++ API は、std::vector (cl::vector) と std::string (cl::string) の両方の代替を提供するか、開発者が独自の実装を使用するオプションを提供します。

したがって、これらの標準 C++ 型のさまざまな実装間に互換性の問題があるようです。したがって、OpenCL は、OpenCL が必要とするものに対して機能することが知られている独自の型を提供します。

ただし、デフォルトでは、OpenCL は標準の C++ 型に固執することに注意してください。cl::vector および cl::string を使用するには、マクロ__NO_STD_VECTORおよび/またはを定義する必要があります__NO_STD_STRING。これらの 2 つの置換タイプは、機能が制限されているため、OpenCL 以外のコードにはおそらく使用しないでください。例: 私が理解しているように、cl::vector はデフォルトで 10 要素に制限されており、それを超えてサイズを変更する方法はありません。私の Linux マシンでの簡単なテストでは、cl::vector オブジェクトへの 10 個を超える要素の push_back() が実際に黙って失敗しました。それはとても怖いです。

残念ながら、どのツールチェーンがこれらの問題を正確に引き起こしているかについて、詳細を見つけることができませんでした。私は OpenCL の仕事を始めたばかりなので、まだ私の経験から話すことはできません。しかし、私はできる限り標準の std::vector を使用し、代わりに悪いツールチェーンを避けようとします。

于 2015-09-29T13:59:10.277 に答える
0

どちらのクラスも似ています。cl::vector実装していませんresize, reserve, insert, erase or swap(少なくとも OpenCL 1.1 では)。したがって、これらの関数のいずれかが必要な場合は、 を使用する必要がありますstd::vector

于 2012-12-22T12:18:27.757 に答える