我正在编写一个编译器,用于具有空语句的语言的赋值.对于像if-then-else这样的结构,如果我可以在llvm中使用no-op语句,但我没有找到任何"官方"nop,这可能很方便.我有一些想法,但理想情况下我想让llvm优化代码的这一部分并删除指令; 任何建议?
(我正在准备一个简短的erlang教程)以及我们如何能够拥有并发或并行的东西(例如,在一个核心上运行的经典C hello世界),这是并发的而不是并行的(例如,在一个代码上运行多个actor的erlang程序)以及并行和并发的东西(例如,在多个核上运行的先前的erlang程序).
但是,我不太确定我们怎么能有一些有意义的并行而不是并发的东西; 我想我们可以砍掉一个程序的指令并将它们并行运行,但这不会产生任何有意义的结果.运行两个不在两个内核上交互的程序是没有并发性的并行系统的一个例子吗?不知怎的,我觉得可能有一个更好的例子; 有任何想法吗?
并行程序无法实现理想加速的原因是什么?
例如,我考虑过数据依赖性,线程(或参与者)之间数据传输的成本,访问相同数据结构的同步,任何其他想法(或我提到的原因的子类别)?
我对erlang actor模型中出现的问题特别感兴趣,但欢迎任何其他问题.
我正在阅读有关文件io的 erlang 文档,看到了这个:
在支持线程的操作系统上,可以让文件操作在自己的线程中执行,从而允许其他 Erlang 进程继续与文件操作并行执行。请参阅 erl(1) 中的命令行标志 +A。
所以我期望的是,如果我添加异步线程,IO操作所需的时间将会减少。
相反,当我尝试运行erl +A1, erl +A6or erl +A12(在 6 核机器上)时,写入文件所需的时间增加了 5-10 倍。
我曾经timer:tc/3测量时间,并在使用标志打开文件时使用io:write/2, file:write/2(将术语转换为二进制)和。该术语大小约 170kb,被写入 1000 次。使用 R14B04(但我用 R15A 也得到了类似的结果)。file:write/2raw
我在使用异步 IO 或测量其效率方面是否做错了什么?
是否通过该术语(可能是因为它的大小很小)带来的开销超过了所获得的加速?
(不太优雅:$)代码:
-module(test).
-compile(export_all).
test()->
{ok,F}=file:open(foo,[raw,write]), % or just [write]
{T,ok}=timer:tc(test,t,[F,1000]),
file:close(F),
T.
t(_,0)->ok;
t(F,A)->
B=dsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdf,
file:write(F,
term_to_binary([B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B])),
%or io:write(F,[B,..])
t(F,A-1).
Run Code Online (Sandbox Code Playgroud)
我对最小化 IO 开销(基本上只是输出)感兴趣,因为我想在分析过程中将一些数据写入磁盘;这就是为什么将数据发送到其他进行写入的进程没有帮助(除非我可以以某种方式将核心投入到进程中)。到目前为止,最好的方法似乎是打开一个原始文件,积累数据然后写入;任何提示将不胜感激:)