在julia中的writedlm()未保存time_ns()结果
我正在使用一个在for循环中包含许多函数调用的程序。简而言之,是这样的:在julia中的writedlm()未保存time_ns()结果,julia,Julia,我正在使用一个在for循环中包含许多函数调用的程序。简而言之,是这样的: function something() .... .... timer = zeros(NSTEP); for it = 1:NSTEP # time steps tic = time_ns(); Threads.@threads for p in 1:2 # Star parallel of two sigma functions Threads.
function something()
....
....
timer = zeros(NSTEP);
for it = 1:NSTEP # time steps
tic = time_ns();
Threads.@threads for p in 1:2 # Star parallel of two sigma functions
Threads.lock(l);
Threads.unlock(l);
arg_in_sig[p] = func_sig[p](arg_in_sig[p]);
end
.....
.....
Threads.@threads for p in 1:2
Threads.lock(l)
Threads.unlock(l)
arg_in_vel[p] = func_vel[p](arg_in_vel[p])
end
toc=time_ns();
timer[i] = toc-tic;
end # time loop
writedlm("timer.txt",timer)
return
end
我想做的是测量每次循环迭代所需的时间,将结果保存在一个名为“timer.txt”的输出文件中。问题是它不起作用。
它保存一个文件,文件上全是零(两个或三个值除外,这更容易混淆)。
我制作了一个玩具示例,如:
using DelimitedFiles;
function test()
a=zeros(1000)
for i=1:1000
tic = time_ns();
C = rand(20,20)*rand(20,20);
toc = time_ns();
a[i] = toc-tic;
end
writedlm("aaa.txt",a);
return a;
end
而这些实际上是有效的(它节省了很多钱!)。我正在实现线程。@Threads?。在我的程序中,writedlm()和time_ns()之间会发生什么
任何帮助都是非常感谢的 您正在迭代
它
,但尝试通过以下方式保存:
timer[i] = toc-tic;
虽然它应该是
timer[it] = toc-tic;
也许您在全局范围内有一些i
,因此代码仍然有效
另外,锁定线程并立即解锁似乎没有多大意义。此外,当您迭代
p
时,它恰好也是保存结果的向量
单元格的索引,根本不需要使用锁定机制(除非您调用一些依赖于全局状态的函数) 在调用writedlm之前,您是否以某种方式检查所有线程是否已成功完成任务?嗨@Bill No,我没有检查任何要完成的任务。我真的以为他们在我叫writedlm的时候就完成了。。。我怎么能这样做?。谢谢为了得到一个好的答案,你可能需要修改这个问题,给出一个最小规模的工作示例,它运行并显示问题谢谢你的回答。上面的代码是为了解释而键入的。在原始代码中,索引为ìt
。关于最后一条评论,我认为我的函数取决于全局状态,尽管我并不十分确定……我认为如果您需要更多帮助,您需要提供一个暴露不希望出现的行为的最小工作示例。