私は、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 とは何ですか...助けてくれてありがとう。