9

させて

import pyopencl as cl
import pyopencl.array as cl_array
import numpy
a = numpy.random.rand(50000).astype(numpy.float32)
mf = cl.mem_flags

違いは何ですか

a_gpu = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a)

a_gpu = cl_array.to_device(self.ctx, self.queue, a)

そして、の違いは何ですか

result =  numpy.empty_like(a)
cl.enqueue_copy(self.queue, result, result_gpu)

result = result_gpu.get()

4

2 に答える 2

18

バッファはCLのバージョンでありmallocpyopencl.array.Arrayコンピューティングデバイス上のnumpy配列に似ています。

したがって、質問の最初の部分の2番目のバージョンでは、a_gpu + 2配列内の各数値に2が追加された新しい配列を取得するように記述できますが、の場合Buffer、PyOpenCLはバイトのバッグのみを認識し、実行できません。そのような操作。

質問の2番目の部分も逆に同じです。PyOpenCL配列がある場合は.get()、データをコピーして戻し、(ホストベースの)numpy配列に変換します。numpy配列はPythonで連続したメモリを取得するためのより便利な方法の1つであるため、2番目のバリアントenqueue_copyもnumpy配列になりますが、このデータを任意のサイズの配列にコピーできた可能性があることに注意してください(十分な大きさです)および任意のタイプ-コピーはバイトのバッグとして実行され.get()ますが、ホストで同じサイズとタイプを取得するようにしてください。

ボーナスファクト:もちろん、各PyOpenCL配列の基礎となるバッファーがあります。.data属性から取得できます。

于 2012-11-24T16:50:43.823 に答える
3

最初の質問に答えるために、バッファインターフェイス参照Buffer(hostbuf=...))を実装するものなら何でも呼び出すことができます。 (参照)を使用して呼び出す必要があります。 バッファインターフェイスを実装し、どちらの場所でも機能します。ただし、たとえばa (バッファインターフェイスも実装している)でのみ機能することが期待されます。私はこれを確認していませんが、ドキュメントが示唆しているようです。pyopencl.array.to_device(...)ndarrayndarrayhostbuf=...bytearray

2番目の質問では、それを呼び出すときにどのタイプresult_gpuが想定されているのかわかりませんget()Buffer.get_host_array()つまり?)いずれの場合も、とenqueue_copy()の組み合わせの間で機能し、オフセットと領域を持つことができ、非同期にすることができます(と) 、そして私はこれらの機能はその方法でのみ利用可能だと思います(一方、ブロックしてバッファ全体を返します)。(参照BufferImagehostis_blocking=Falseget()

于 2012-11-21T06:13:30.490 に答える