关于如何为可能容易出现死锁和竞争条件的代码编写可重复单元测试的任何建议?
现在我倾向于跳过单元测试并专注于压力测试.问题是你可以进行5次压力测试并看到五种不同的结果.
编辑:我知道它可能只是一个梦想,但如果有一种方法来控制单个线程并导致它们一次执行一条指令,那么我可能会到达某个地方.
我正在制作一个操纵不同尺寸图像的程序.这些操作中的许多操作从输入读取像素数据并写入单独的输出(例如模糊).这是基于每个像素完成的.
这种图像映射在CPU上非常紧张.我想用多线程来加快速度.我该怎么做?我想要为每行像素创建一个线程.
我有几个要求:
谢谢.
有关这个主题的更多信息:C++并行化库:OpenMP与线程构建块
c++ parallel-processing optimization multithreading image-processing
英特尔线程构建块给我留下了深刻的印象.我喜欢我应该如何编写任务而不是线程代码,我喜欢它如何在我的有限理解下工作(任务在池中,4核上不会有100个线程,任务不能保证运行,因为它不是它自己的线程可能会进入池中.但它可能与另一个相关的任务一起运行,所以你不能做坏事,如典型的线程不安全的代码).
我想更多地了解写作任务.我喜欢这里的"基于任务的多线程 - 如何为100个内核编程"视频http://www.gdcvault.com/sponsor.php?sponsor_id=1(目前是第二个最后一个链接.警告它不是'很棒').我最喜欢的部分是"解决迷宫最好并行完成",大约是48分钟(你可以点击左侧的链接.如果有的话,这部分真的是你需要观察的).
但是,我希望看到更多的代码示例和一些如何编写任务的API.有没有人有很好的资源?我不知道一个类或多个代码片段在将它推入池中后可能看起来如何或当你需要复制所有内容以及将所有内容推送到池中时,它们看起来有多奇怪.
您对将尝试获取代码并自动将其拆分为线程的项目有何看法(可能是编译时,可能是在运行时).
看看下面的代码:
for(int i=0;i<100;i++)
sum1 += rand(100)
for(int j=0;j<100;j++)
sum2 += rand(100)/2
Run Code Online (Sandbox Code Playgroud)
这种代码可以自动分成两个并行运行的不同线程.你认为它甚至可能吗?我有一种感觉,理论上它是不可能的(它让我想起停止问题),但我无法证明这种想法.
你认为这是一个有用的项目吗?有什么类似的吗?
java parallel-processing multithreading project virtual-machine
我正在尝试将GNU parallel大量文件发布到Web服务器.在我的目录中,我有一些文件:
file1.xml
file2.xml
Run Code Online (Sandbox Code Playgroud)
我有一个看起来像这样的shell脚本:
#! /usr/bin/env bash
CMD="curl -X POST -d@$1 http://server/path"
eval $CMD
Run Code Online (Sandbox Code Playgroud)
脚本中还有其他一些东西,但这是最简单的例子.我试图执行以下命令:
ls | parallel -j2 script.sh {}
Run Code Online (Sandbox Code Playgroud)
这些GNU parallel页面显示为对目录中的文件进行操作的"正常"方式.这似乎将文件的名称传递给我的脚本,但curl抱怨它无法加载传入的数据文件.但是,如果我这样做:
find . -name '*.xml' | parallel -j2 script.sh {}
Run Code Online (Sandbox Code Playgroud)
它工作正常.在我的脚本中传递参数的方式ls和find方法之间是否存在差异?或者我是否需要在该脚本中执行其他操作?
看起来当我map在并行列表上调用时,操作并行运行,但是当我filter在该列表上执行时,操作严格按顺序运行.因此,为了使filter并行,我首先映射到(A,布尔),然后过滤那些元组,并再次映射所有元组.感觉不太方便.
所以我感兴趣 - 并行集合上的哪些操作是并行化的,哪些不是?
有多种方法可以观察任务中抛出的异常.其中一个是在带有OnlyOnFaulted的ContinueWith中:
var task = Task.Factory.StartNew(() =>
{
// Throws an exception
// (possibly from within another task spawned from within this task)
});
var failureTask = task.ContinueWith((t) =>
{
// Flatten and loop (since there could have been multiple tasks)
foreach (var ex in t.Exception.Flatten().InnerExceptions)
Console.WriteLine(ex.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)
我的问题:一旦failureTask开始,是否会自动观察异常,或者只有在我触摸'ex.Message时才会观察到异常?
.net c# parallel-processing multithreading task-parallel-library
请考虑以下两个陈述:
(a `par` b) `pseq` (a + b)
Run Code Online (Sandbox Code Playgroud)
和
a `par` (b `pseq` (a + b))
Run Code Online (Sandbox Code Playgroud)
有人可以解释他们的行为如何彼此不同吗?
对于第一个,如果主线程已完成计算b但火花计算a尚未完成,主线程是否会继续计算a + b?
我有一个计算基本上做了以下几点:
f :: [a] -> ([b],Bool)
Run Code Online (Sandbox Code Playgroud)
实际上可以编写此函数
f = foldr h ([],False) . map g
where h (b,bool) (bs,boolSoFar) = (b:bs,bool || boolSoFar)
Run Code Online (Sandbox Code Playgroud)
哪些g :: a -> (b,Bool)是需要花费大量时间的功能.此外,f通常在小列表上调用,因此尝试并行计算地图似乎很有趣.这可以通过Control.Parallel.Strategies parMap来完成.所以现在我们使用
f = foldr h ([],False) . parMap rseq g
where h (b,bool) (bs,boolSoFar) = (b:bs, bool || boolSoFar)
Run Code Online (Sandbox Code Playgroud)
一切都很好.现在,您将注意到可以在第一个定义中执行顺序优化f.也就是说,我可以使用map-fold fusion将其作为单个折叠编写,因此在列表中循环一次.但是,我失去了做并行的好处.
现在,有人可能会说,在第二个定义中f,再次循环列表并不是那么糟糕,所以为什么不这样做呢.我想我的想法是,如果Haskell有可变变量,那么可以在map的主体中更新这个布尔变量(我想你必须锁定并解锁它).做这样的事情有什么建议吗?
在Java语言规范的第17章中,有一节解释了为什么"在一致性不充分之前发生".这是一个例子:
At first, x = y = 0
Thread 1 | Thread 2
r1 = x; | r2 = y;
if (r1 != 0) y = 1; | if (r2 != 0) x = 1;
Run Code Online (Sandbox Code Playgroud)
这是一个可能的执行跟踪:
r1 = x; // sees write of x = 1
y = 1;
r2 = y; // sees write of y = 1
x = 1;
Run Code Online (Sandbox Code Playgroud)
怎么会发生这种情况?令我困惑的是,当第一个动作看到x = 1时,是不是意味着条件r2!= 0变为真,因此y被分配给1?但按顺序,在r1 = x之后,y = 1.我在哪里弄错了理解这个例子?我该如何正确理解这个例子呢?
.net ×2
c# ×2
haskell ×2
java ×2
bash ×1
c++ ×1
collections ×1
concurrency ×1
find ×1
ghc ×1
gnu-parallel ×1
jvm ×1
linux ×1
optimization ×1
project ×1
scala ×1
tbb ×1
vb.net ×1
x86 ×1