我的任务是采用现有的单螺纹蒙特卡罗模拟并对其进行优化.这是ac#console app,没有db访问它从csv文件加载一次数据并在最后写出来,所以它几乎只是CPU绑定,也只使用大约50mb的内存.
我通过Jetbrains dotTrace探测器运行它.在总执行时间中,大约30%生成均匀随机数,24%将均匀随机数转换为正态分布随机数.
基本算法是一大堆嵌套for循环,在中心有随机数调用和矩阵乘法,每次迭代返回一个加到结果列表中的double,这个列表定期排序并测试一些收敛标准(检查时)如果可以接受的话,程序会从循环中断开并写入结果,否则它会继续到最后.
我希望开发人员能够权衡:
由于我从未编写任何并行或多线程代码,因此欢迎使用上述教程的一些链接.
当前应用程序需要2个小时进行500,000次迭代,业务需要将其扩展到3,000,000次迭代,并且每天被称为多次,因此需要进行一些繁重的优化.
特别想听听使用Microsoft Parallels Extension或AForge.Net Parallel的人的意见
这需要相当快productionised所以.NET 4测试版出来,即使我知道它已经并发库烤,我们可以看看迁移到.NET 4后沿着轨道一旦它的发布.目前服务器有.Net 2,我已提交审核升级到我的开发箱所具有的.net 3.5 SP1.
谢谢
更新
我刚刚尝试了Parallel.For实现,但它提出了一些奇怪的结果.单线程:
IRandomGenerator rnd = new MersenneTwister();
IDistribution dist = new DiscreteNormalDistribution(discreteNormalDistributionSize);
List<double> results = new List<double>();
for (int i = …Run Code Online (Sandbox Code Playgroud)
(fileNameToCharStream "bigfile"
|>> fuse [length;
splitBy (fun x -> x = ' ' || x = '\n') removeEmpty |>> length;
splitBy (fun x -> x = '\n') keepEmpty |>> length;
])
(*fuse "fuses" the three functions to run concurrently*)
|> run 2 (*forces to run in parallel on two threads*)
|> (fun [num_chars; num_words; num_lines] ->
printfn "%d %d %d"
num_chars num_words, num_lines))
我想以下列方式使这段代码工作:将原始流分成两个正好在中间; 然后为每一半运行一个单独的计算,计算3件事:长度(即字符数),字数,行数.但是,如果我错误地将一个单词分开,我不想有问题.这必须得到照顾.该文件应该只读一次.
我应该如何编程指定的函数和运算符| >>?可能吗?
我正在考虑为我想解决的一个问题利用并行性.问题大致如下:给定输入(点序列)找到最佳输出(由这些点组成的最大三角形,最长线等).在点序列中有3种不同的"形状",但我只对"最佳得分"(通常是某种形式的"长度"倍数系数)感兴趣.我们称之为形状S1,S2,S3.
我有2种不同的算法来解决S1 - 'S1a'在O(n 2)中,'S1b'大多表现得更好,但最坏的情况是O(n 4).
第一个问题:是否有一些简单的方法可以并行运行S1a和S1b,使用先完成并停止另一个的方法?至于我正在阅读文档,这可以使用一些forkIO编程并在获得结果时杀死线程 - 只是询问是否有更简单的东西?
第二个问题 - 更加困难:我以这种方式调用优化函数:
optimize valueOfSx input
Run Code Online (Sandbox Code Playgroud)
valueOfSx特定于每个形状,并返回"得分"(或得分的猜测)可能的解决方案.优化调用此函数以找出最佳解决方案.我感兴趣的是:
s1 = optimize valueOfS1 input
s2 = optimize valueOfS2 input
s3 = optimize valueOfS3 input
<- maximum [s1,s2,s3]
Run Code Online (Sandbox Code Playgroud)
但是,如果我知道S1的结果,我可以丢弃所有较小的解决方案,从而使s2和s3收敛得更快,如果不存在更好的解决方案(或者至少丢弃最差的解决方案,从而提高空间效率).我现在在做的是:
zeroOn threshold f = decide .f
where decide x = if (x < threshold) then 0 else x
s1 = optimize valueOfS1 input
s2 = optimize (zeroOn s1 valueOfS2) input
s3 = optimize (zeroOn (max s1 s2) valueOfS3) input
Run Code Online (Sandbox Code Playgroud)
现在的问题是:我能以这样的方式如运行S2和S3并行,无论哪完成第一次将更新其他线程运行的得分功能的"门槛"参数?在某种意义上的东西:
threshold = 0 …Run Code Online (Sandbox Code Playgroud) parallel-processing concurrency haskell speculative-execution
我有一个巨大的图表,我想用很多机器来处理.
我想计算图表直径是否高于50.
我如何分割数据,我会写一个可以计算它的并行算法吗?(返回值是布尔值)
图形直径是任何顶点对之间的最大距离
我创建了一个简单的CUDA应用程序来添加两个矩阵.它编译得很好.我想知道所有线程如何启动内核以及CUDA中的流程是什么?我的意思是,每个线程以什么方式执行矩阵的每个元素.
我知道这是一个非常基本的概念,但我不知道这一点.关于流量我很困惑.
在哪里可以找到k-最近邻算法的串行C/C++实现?
你知道有这个库吗?
我找到了openCV,但实现已经并行了.
我想从串行实现开始,并使用pthreads openMP和MPI并行化.
谢谢,
亚历克斯
场景:
给定一组资源R:

给定一组线程T,它将并行运行:

每个线程都需要访问n个资源的列表.每个列表都是R的样本,这意味着每个资源在每个列表中都是唯一的:

但由于访问列表是随机采样的,因此可能存在冲突:

随机资源列表将在开始时初始化一次.之后,每个线程随后将对列表中的每个资源执行atomicAdd操作.每个列表中资源的访问顺序无关紧要.
题:
是否有一种算法可以对调度列表进行排序,从而最大限度地减少写入冲突的数量?所以最终结果如下:

到目前为止我的见解:
可能的方法:
我正在为这个问题寻找解决方案.它可能是完整的吗?如果是这种情况,我正在考虑设计一种遗传算法来解决这个问题.
编辑1:添加图表.
在Julia中,你想要根据向量函数f(x)来计算一个不精确的雅可比行列式,这需要大量的计算来评估.雅各比派的评价显然在概念上非常平行.我的问题是,这可以在Julia中完成而不需要使用DistributedArray,SharedArray等吗?
例如,假设您有代码:
function Jacob(f::Function,x)
eps=1e-7
delta=eps*eye(length(x))
J=zeros(length(x),length(x))
for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
end
J
end
Run Code Online (Sandbox Code Playgroud)
是否有可能按照与手册中的200000000随机硬币翻转总和相同的方式对此进行并行化?也就是说,等同于
nheads = @parallel (+) for i=1:200000000
int(randbool())
end
Run Code Online (Sandbox Code Playgroud)
我试过这个:
function Jacob(f::Function,x)
require("testfunc.jl");
eps=1e-7
delta=eps*eye(length(x))
J=zeros(length(x),length(x))
J=@parallel (+) for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
J
end
J
end
Run Code Online (Sandbox Code Playgroud)
其中"testfunc.jl"是找到此代码的文件的名称,以及f本身的定义.当我尝试这个时,用f简单地评估x.^ 2 + cos(x),我能够得到一个正确的(对角线)矩阵,但是这些值与非并行代码给出的值不相符(我可以确认是正确的值).进一步调查表明,当使用julia -p 4时,得到的雅可比行列式的某些值乘以2或3.
我所描述的方法是否合理(并且只需要调整以防止重复评估)?如果没有,是否有另一种方法可以在不使用更复杂的特殊数组类型的情况下评估雅可比行列式?
似乎在并行for循环内添加"J = zeros(n,n)"作为第一个操作可以纠正这个重复问题.如果不诉诸J阵列的强力清除,可以做同样的事情吗?
鉴于以下在一维数组中查找奇数的简单任务:
begin
odds := 0;
Ticks := TThread.GetTickCount;
for i := 0 to MaxArr-1 do
if ArrXY[i] mod 2 = 0 then
Inc(odds);
Ticks := TThread.GetTickCount - Ticks;
writeln('Serial: ' + Ticks.ToString + 'ms, odds: ' + odds.ToString);
end;
Run Code Online (Sandbox Code Playgroud)
看起来这将是并行处理的一个很好的候选者.因此可能会想要使用以下TParallel.For版本:
begin
odds := 0;
Ticks := TThread.GetTickCount;
TParallel.For(0, MaxArr-1, procedure(I:Integer)
begin
if ArrXY[i] mod 2 = 0 then
inc(odds);
end);
Ticks := TThread.GetTickCount - Ticks;
writeln('Parallel - false odds: ' + Ticks.ToString + 'ms, odds: ' + odds.ToString);
end;
Run Code Online (Sandbox Code Playgroud)
这种并行计算的结果在两个方面有点令人惊讶: …
语境:
concurrent.futures.process.ProcessPool来执行代码的Python 应用服务器(是的,我知道importlib.reload有警告)
为了让它工作,我想我必须在进程池管理的importlib.reload每个multiprocessing进程中执行。
有没有办法向进程池中的所有进程提交一些东西?
python parallel-processing multiprocessing python-multiprocessing process-pool
algorithm ×2
c ×1
c# ×1
c++ ×1
concurrency ×1
cuda ×1
delphi ×1
delphi-xe7 ×1
f# ×1
gpgpu ×1
graph ×1
haskell ×1
julia ×1
knn ×1
nvidia ×1
pipeline ×1
process-pool ×1
python ×1
sorting ×1
threadpool ×1