Performance ArrayFire.jl setindex!很慢

Performance ArrayFire.jl setindex!很慢,performance,gpu,julia,gpgpu,arrayfire,Performance,Gpu,Julia,Gpgpu,Arrayfire,因此,我尝试使用ArrayFire.jl来加速一些Julia代码,但我所做的只是降低它的速度。使用@profile,我已经追踪到了setindex。以下是测试代码: using ArrayFire function f(x::Array{Float32}) y = zeros(Float32, size(x)) for i in 1:length(x) y[i] = x[i] end return y end function f(x::AFA

因此,我尝试使用ArrayFire.jl来加速一些Julia代码,但我所做的只是降低它的速度。使用
@profile
,我已经追踪到了
setindex。以下是测试代码:

using ArrayFire

function f(x::Array{Float32})
    y = zeros(Float32, size(x))
    for i in 1:length(x)
        y[i] = x[i]
    end
    return y
end

function f(x::AFArray{Float32})
    y = AFArray(zeros(Float32, size(x)))
    for i in 1:length(x)
        y[i] = x[i]
    end
    return y
end

srand(1)

a = rand(Float32, 20, 20)
b = AFArray(a)

@time f(a)
@time f(b)
这两者之间的速度差是五个数量级

根据分析器,原因是
setindex非常慢是因为
af\u assign\u gen
af\u sum\u all
非常慢


我错过什么了吗?我是GPGPU编程的新手,所以我可能根本不理解这一切应该如何工作。

for
循环不在GPU上运行,因此每次迭代都有同步步骤和相对昂贵的CPU->GPU内存写入。如果您使用“支持的函数”中列出的数组函数,而不是任意代码,那么您将真正看到性能提升。(另外,请务必阅读ArrayFire.jl文档中的“关于REPL行为的说明”和“关于基准测试的说明”)