Arrayfire.jl 向量叉积的可能解决方法?
Possible workarounds for vector cross product with Arrayfire.jl?
我正在尝试使用 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]]);
我认为以下应该可行:
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)
为了回答我自己,可以使用 circshift() 函数在 GPU 中创建移位向量来完成叉积,然后可以进行 element-wise 乘法和减法。这不是最优雅的方式,但它确实有效。
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
我正在尝试使用 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]]);
我认为以下应该可行:
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)
为了回答我自己,可以使用 circshift() 函数在 GPU 中创建移位向量来完成叉积,然后可以进行 element-wise 乘法和减法。这不是最优雅的方式,但它确实有效。
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