2017-01-12 5 views
2

ArrayFire.jlを使用してベクトル演算を実行しようとしていますが、ベクトルクロス積の関数がArrayfireに実装されていません。 JuliaのArrayfire.jlラッパーを効率的に使用して計算するための回避策はありますか?単純な方法で関数を定義することは、デバイスとホスト間のすべてのデータ転送のために実際には遅いですし、これを解決する方法を理解するのに十分なラッパー関数を理解していません。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]]); 
+0

ですから、この使用して、配列の火をしたいか、または単に(非常に高速であるクロス機能が組み込まれています...)ジュリアのlinalgを使用して –

+0

私はArrayFireを使用して、それをしたいので、私はオフロードすることができますGPUへの計算と私のコードのスピードアップ。 – Boxed

+0

3つのAFArraysをとり、与えた定義を使って最初の要素を設定するバージョンを書くことができますか? –

答えて

1

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

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 
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) 
関連する問題