2

私は、Matlab で想像できる最も基本的な GPU 操作であると思われることを実行しようとしていますが、それを理解できないようです。

100 万の 3D 座標のリストがあり、他の 1 点からの距離を調べたいと考えています。コアは単純な二乗和関数「getDist(a,b)」の平方根で、a と b は 3x1 ベクトルです。

GPU がなければ、次のような総当たり攻撃が可能です。

for x = 1:1e6 d(x) = getDist(points(:,x),point) end

メモリを浪費しても構わない場合は、repmat を使用して単一のポイントを何度も繰り返すことができます。これは GPU で機能すると思います。

ポイント GPU = gpuArray(ポイント); pointGPS = gpuArray(repmat(point,1,1e6));

d = sqrt(sum((ポイントGPU - ポイントGPU).^2)));

これは、CPU よりも低速です。GPUでなぜか.^2が遅いという問題に絞り込みました。基本的に、上の行を個々の部分 (減算、2 乗、合計、および sqrt) に分割しました。GPU ではすべてがほぼ 10 倍高速でしたが、.^2 は遅くなりました。配列自体に .* を乗算すると、CPU で同じ時間がかかり、 GPU。

私はarrayfunを使ってみました:

d = arrayfun(@(x) getDist(点(:,x),点), 1:1e6)

ただし、これにより GPU でエラーが発生します:「gpuArray 出力タイプは現在実装されていません」。これは、関数に埋め込まれずに、GPU 配列が 1:1e6 の場所にあることを意味していると解釈します。単一の要素ではなく、一度に列を取りたいので、そのように定式化する方法がわかりません。

これは解決可能でなければなりません。大規模な並列ジオメトリの問題を解決しない場合の GPU とは何ですか...助けてくれてありがとう。

4

0 に答える 0