2

ArrayFire.jl を使用してベクトル演算を実行しようとしていますが、ベクトル クロス積の関数が Arrayfire に実装されていません。Julia の Arrayfire.jl ラッパーを使用してパフォーマンスの高い方法で計算するための回避策はありますか? デバイスとホスト間のすべてのデータ転送のために単純な方法で関数を定義するのは非常に遅く、これを解決する方法を理解するのに十分なラッパー関数を理解していません。

cross(a::ArrayFire.AFArray, b::ArrayFire.AFArray) = ArrayFire.AFArray([a[2]*b[3]-a[3]*b[2]; a[3]*b[1]-a[1]*b[3]; a[1]*b[2]-a[2]*b[1]]);
4

2 に答える 2

1

自分自身に答えるために、外積は circshift() 関数を使用して GPU でシフトされたベクトルを作成し、要素ごとの乗算と減算を行うことができます。これは最もエレガントな方法ではありませんが、機能します。

function cross(a::ArrayFire.AFArray{Float32,1}, b::ArrayFire.AFArray{Float32,1})
    ashift = circshift(a, [-1]);
    ashift2 = circshift(a, [-2]);
    bshift = circshift(b, [-2]);
    bshift2 = circshift(b, [-1]);
    c::ArrayFire.AFArray{Float32,1} = ashift.*bshift - ashift2.*bshift2;
end
于 2017-01-16T13:23:35.957 に答える
0

私は以下がうまくいくはずだと思います:

function cross!(c::AFArray, a::AFArray, b::AFArray)
    c[1] = a[2]*b[3]-a[3]*b[2]
    c[2] = a[3]*b[1]-a[1]*b[3]
    c[3] = a[1]*b[2]-a[2]*b[1]
end

c = AFArray(zeros(3))
a = AFArray([1.0, 2, 3])
b = AFArray([3.0, 4, 5])

cross!(c, a, b)
于 2017-01-12T21:04:31.913 に答える