Julia 使用Arrayfire.jl的向量叉积的可能解决方法?

Julia 使用Arrayfire.jl的向量叉积的可能解决方法?,julia,arrayfire,Julia,Arrayfire,我尝试使用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

我尝试使用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中创建移位向量,然后进行元素乘法和减法。这不是最优雅的方式,但它很有效

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

那么您是想使用array fire还是仅仅使用julia的linalg(它有一个内置的交叉函数,速度非常快…)我想使用ArrayFire来完成这项工作,这样我就可以将计算转移到GPU并加速我的代码。你能不能编写一个版本,使用3个AFArray并使用你给出的定义来设置第一个AFArray的元素?如果我了解ArrayFire.jl包的较低级别包装功能,也许可以,但是使用像[I]这样的索引功能是的,它应该能提供相当大的加速。我需要计算大约175000个实例,大多数代码都可以利用并行化。我在加速代码方面取得了很好的成功,但现在遇到了这个问题,不幸的是,我无法摆脱交叉产品。