Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop julia@parallel for循环不更新数组_For Loop_Multidimensional Array_Parallel Processing_Julia - Fatal编程技术网

For loop julia@parallel for循环不更新数组

For loop julia@parallel for循环不更新数组,for-loop,multidimensional-array,parallel-processing,julia,For Loop,Multidimensional Array,Parallel Processing,Julia,我是julia的新手,为了开始,我想向julia移植一些numpy代码,并希望获得一些不错的性能提升。到目前为止我还不满意 这是我要计算的函数 function s(x_list, r_list) result_list = zeros(size(x_list,1)) for i = 1:size(x_list,1) dotprods = r_list * x_list[i,:]' expcall = exp(im * dotprods)

我是julia的新手,为了开始,我想向julia移植一些numpy代码,并希望获得一些不错的性能提升。到目前为止我还不满意

这是我要计算的函数

function s(x_list, r_list)
    result_list = zeros(size(x_list,1))
    for i = 1:size(x_list,1)
        dotprods = r_list * x_list[i,:]'
        expcall  = exp(im * dotprods)
        sumprod  = sum(expcall) * sum(conj(expcall))
        result_list[i] = sumprod
    end
    return result_list
end
数据输入看起来像

v = rand(3)
r = rand(6000,3)
x = linspace(1.0, 2.0, 300) * (v./sqrt(sumabs2(v)))'
对于这个函数和给定的输入,
@time s(x,r)
给出了

0.110619 seconds (3.60 k allocations: 96.256 MB, 8.47% gc time)
在这种情况下,numpy在大约70毫秒内完成了相同的工作,所以我不是很高兴!现在,如果我使用
julia-p2
循环执行
@并行:

function s(x_list, r_list)
    result_list = SharedArray(Float64, size(x_list,1))
    @parallel for i = 1:size(x_list,1)
        dotprods = r_list * x_list[i,:]'
        expcall  = exp(im * dotprods)
        sumprod  = sum(expcall) * sum(conj(expcall))
        result_list[i] = sumprod
    end
    return result_list
end
问题是

result_list[i] = sumprod
没有更新,我得到了数组初始化返回的零列表。我做错了什么? 进一步尝试提高速度也没有显示出任何好处,例如

@vectorize_2arg Array{Float64,2} s
和声明类型

function s{T<:Float64}(x_list::Array{T,2}, r_list::Array{T,2}) 
对于给定的函数和输入,这实际上是不可能的!这是虫子吗


非常感谢您的帮助

Julia的
@parallel
宏执行分布式for循环:它将所有数据复制到其他进程,并对每个进程进行计算,减少结果并返回结果。这些进程不共享内存,甚至可能在其他机器上。您的原始数据永远不会被触及,因为每个工作人员都在修改自己的数据副本。您可能会想到线程,这是Julia将来将要添加的一项当前实验性功能。

Julia的
@parallel
宏执行分布式for循环:它将所有数据复制到其他进程并对每个进程进行计算,减少结果并返回结果。这些进程不共享内存,甚至可能在其他机器上。您的原始数据永远不会被触及,因为每个工作人员都在修改自己的数据副本。您可能正在考虑线程,这是Julia将在将来添加的一个当前实验性功能。

一个问题是您没有等待
@parallel
调用完成。发件人:

…如果不需要,可以省略还原运算符。在这种情况下,循环异步执行,也就是说,它在所有可用的worker上生成独立的任务,并立即返回Future数组,而无需等待完成。调用者可以通过调用
fetch()
在稍后的时间点等待将来的完成,或者在循环结束时用
@sync
作为前缀等待完成,比如
@sync@parallel for


尝试使用
@sync

作为循环的前缀。一个问题是,您没有等待
@parallel
调用完成。发件人:

…如果不需要,可以省略还原运算符。在这种情况下,循环异步执行,也就是说,它在所有可用的worker上生成独立的任务,并立即返回Future数组,而无需等待完成。调用者可以通过调用
fetch()
在稍后的时间点等待将来的完成,或者在循环结束时用
@sync
作为前缀等待完成,比如
@sync@parallel for


尝试在for循环前面加上
@sync

哦,很抱歉,我忘了提到我还使用了一个SharedArray作为@parallel for循环的前缀。这实际上应该负责复制。我将修改我的问题,使其变得明显!哦,很抱歉,我忘了提到我还使用了一个SharedArray作为@parallel for循环。这实际上应该负责复制。我将修改我的问题,使其变得明显!谢谢,@sync真的做到了!至于另一部分,我们还可以做些什么来加速julia,从而在单进程模式下获得与python/numpy类似或更好的性能?谢谢,@sync确实做到了!至于另一部分,在单进程模式下,有没有其他方法可以加快julia的速度,以获得与python/numpy类似或更好的性能?
0.000040 seconds (36 allocations: 4.047 KB)