标签: parallel-processing

单元测试,死锁和竞争条件

关于如何为可能容易出现死锁和竞争条件的代码编写可重复单元测试的任何建议?

现在我倾向于跳过单元测试并专注于压力测试.问题是你可以进行5次压力测试并看到五种不同的结果.

编辑:我知道它可能只是一个梦想,但如果有一种方法来控制单个线程并导致它们一次执行一条指令,那么我可能会到达某个地方.

.net c# vb.net parallel-processing

11
推荐指数
1
解决办法
4862
查看次数

C++中的多线程图像处理

我正在制作一个操纵不同尺寸图像的程序.这些操作中的许多操作从输入读取像素数据并写入单独的输出(例如模糊).这是基于每个像素完成的.

这种图像映射在CPU上非常紧张.我想用多线程来加快速度.我该怎么做?我想要为每行像素创建一个线程.

我有几个要求:

  • 必须最小化可执行文件大小.换句话说,我不能使用大量的库.什么是C/C++最轻量级的便携式线程库?
  • 必须最小化可执行文件大小.我想有一个函数forEachRow(fp*),它为每一行运行一个线程,甚至是一个forEachPixel(fp*),其中fp在自己的线程中的一个像素上运行.哪个最好?
    • 我应该使用普通函数或函子或函数或某些lambda函数还是......其他什么?
    • 某些操作使用优化,这些优化需要处理前一个像素的信息.这使得forEachRow有利.即使考虑到这一点,使用forEachPixel会更好吗?
  • 我需要锁定只读和只写数组吗?
    • 输入仅从中读取,但许多操作需要从阵列中的多个像素输入.
    • 每个像素只输出一次输出.
  • 速度也很重要(当然),但优化可执行文件大小优先.

谢谢.

有关这个主题的更多信息:C++并行化库:OpenMP与线程构建块

c++ parallel-processing optimization multithreading image-processing

11
推荐指数
3
解决办法
1万
查看次数

我该如何写任务?(并行代码)

英特尔线程构建块给我留下了深刻的印象.我喜欢我应该如何编写任务而不是线程代码,我喜欢它如何在我的有限理解下工作(任务在池中,4核上不会有100个线程,任务不能保证运行,因为它不是它自己的线程可能会进入池中.但它可能与另一个相关的任务一起运行,所以你不能做坏事,如典型的线程不安全的代码).

我想更多地了解写作任务.我喜欢这里的"基于任务的多线程 - 如何为100个内核编程"视频http://www.gdcvault.com/sponsor.php?sponsor_id=1(目前是第二个最后一个链接.警告它不是'很棒').我最喜欢的部分是"解决迷宫最好并行完成",大约是48分钟(你可以点击左侧的链接.如果有的话,这部分真的是你需要观察的).

但是,我希望看到更多的代码示例和一些如何编写任务的API.有没有人有很好的资源?我不知道一个类或多个代码片段在将它推入池中后可能看起来如何或当你需要复制所有内容以及将所有内容推送到池中时,它们看起来有多奇怪.

parallel-processing tbb

11
推荐指数
1
解决办法
1564
查看次数

自动并行化

您对将尝试获取代码并自动将其拆分为线程的项目有何看法(可能是编译时,可能是在运行时).

看看下面的代码:

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

11
推荐指数
4
解决办法
4734
查看次数

GNU并行"find"和"ls"

我正在尝试将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)

它工作正常.在我的脚本中传递参数的方式lsfind方法之间是否存在差异?或者我是否需要在该脚本中执行其他操作?

linux parallel-processing bash find gnu-parallel

11
推荐指数
2
解决办法
1万
查看次数

Scala并行集合上的哪些操作是并行化的?

看起来当我map在并行列表上调用时,操作并行运行,但是当我filter在该列表上执行时,操作严格按顺序运行.因此,为了使filter并行,我首先映射到(A,布尔),然后过滤那些元组,并再次映射所有元组.感觉不太方便.

所以我感兴趣 - 并行集合上的哪些操作是并行化的,哪些不是?

collections parallel-processing scala

11
推荐指数
1
解决办法
1220
查看次数

在ContinueWith中观察任务异常

有多种方法可以观察任务中抛出的异常.其中一个是在带有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

11
推荐指数
1
解决办法
1万
查看次数

关于Haskell中的'pseq'

请考虑以下两个陈述:

(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

parallel-processing haskell ghc

11
推荐指数
1
解决办法
465
查看次数

Haskell parMap中的共享变量

我有一个计算基本上做了以下几点:

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的主体中更新这个布尔变量(我想你必须锁定并解锁它).做这样的事情有什么建议吗?

parallel-processing haskell

11
推荐指数
1
解决办法
292
查看次数

如何理解Java中"发生一致性还不够"

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.我在哪里弄错了理解这个例子?我该如何正确理解这个例子呢?

java parallel-processing concurrency x86 jvm

11
推荐指数
1
解决办法
178
查看次数