2016-05-17 3 views
1

複数のメモリ割り当てを避けるために、CL_MEM_USE_HOST_PTRとOpenCL関数clCreateBuffer()を使用しようとしました。ちょっとしたリサーチ(リバースエンジニアリング)の後、私はフレームワークがどのフラグを使用していてもオペレーティングシステムの割り当て機能を呼び出すことがわかりました。OpenCL allcoation flag CL_MEM_USE_HOST_PTRがポインタを参照していない

多分私の考えは間違っていますか?しかし、ドキュメンテーションからは、新しいメモリを割り当てる代わりに、DMAを使ってホストメモリにアクセスすることになっています。私は、IntelのGPU上でのインテルデバイス(HD5500)

+0

どの実装ですか? Beignet? – user3528438

+0

いいえ、私はWindows上でopenclの実装を使用しています。 – user6345890

答えて

2

上のOpenCL 1.2を使用しています

は*割り当てられたホスト・ポインタがページ整列し、ページ長であることを確認してください。実際、私はバッファサイズが実際には偶数のキャッシュラインになると思っていますが、私は常に切り上げます。

使用のようなもの:

void *host_ptr = _aligned_malloc(align_to(size,4096),4096)); 

Here's a good article for this: "重要ポイント" で を。

すでにデータを持っているし、その後、OpenCLの バッファオブジェクトにデータを読み込む 4096バイト境界(ページ及びキャッシュ・ライン境界にアライメント)とに割り当てられたバッファにCL_MEM_USE_HOST_PTRを使用したい場合 合計サイズは64バイトの倍数(キャッシュラインサイズ)です。

CL_MEM_ALLOC_HOST_PTRを使用して、ドライバが割り当てを処理するようにすることもできます。しかし、ポインタを取得するにはマッピングしてマップを解除する必要があります(ただし、コピーコストはかかりません)。

+0

tnx。出来た! – user6345890

+0

これは、実装では、開発者が64の倍数にするのを忘れてしまったというエラーを修正していますか? AMD、NVIDIA、などの他の企業を信頼できる? –

+0

私はそうだと思いますが、わかりません。 'ALLOC_HOST_POINTER'を使っても、長さを64バイトの倍数に丸めることができます。おそらくこれをテストすることができます。 – Tim

関連する問題