我是并行编程的新手.我研究了很多关于使用MPI和Windows HPC服务器的SOA编程模型.但现在我比以前更加困惑.手头的任务是在多台计算机上运行程序(IP地址将由用户提供),该程序采用数百万字符串的输入文件并提取某些区域.我已完成编程(在C#和.net4 fw中)并已在一台计算机上成功测试过.但问题是我必须使其并行以加快速度.我只是想让某人向我展示一种不涉及使用MPI的方法.我希望我的问题很清楚.
谢谢.
我有一个函数,通过更新映射执行一步计算(底层是一个可变的HashMap).我想并行执行其中几个计算(每个"链"在自己的可变HashMap上工作).
我通过将HashMaps放入并行集合并使用map将函数应用于每个HashMap来实现此目的.
现在我在地图中遇到了丢失的条目.在调试时,一旦异常断点停止程序,映射就会包含该条目(然后通过丢弃某些堆栈帧层来重新开始计算).
当我使用顺序集合时,此行为已消失.那么有可能存在一些不正常行为(或错误),这是由同一个HashMap在不同的线程中处理的吗?
我没有发布代码示例,因为我不认为该行为是可重现的.据我所知,唯一可变数据包含在那些保持计算状态的HashMaps中.
根据要求,我的代码示例创建(reset)和修改(step)的并行映射.
class ParallelInferer[V <: DiscreteVariable, TInf <: InferenceAlgorithm[V]](val numChains: Int,
val inferer: InferenceAlgorithm[V],
val random: Random) {
//tuples of inferer state and the according random number generator
protected var states: ParSeq[(inferer.Repr,Random)] = _
protected var steps = 0
reset()
def reset() {
steps = 0
val seed = random.nextInt()
//todo why does parallelizing fail here (key not found on a map)
states = (1 to numChains).par
.map(n => new Random(seed + …Run Code Online (Sandbox Code Playgroud) 下面的Perl包装器并行执行命令,将STDOUT和STDERR保存到/ tmp文件:
open(A,"|parallel");
for $i ("date", "ls", "pwd", "factor 17") {
print A "$i 1> '/tmp/$i.out' 2> '/tmp/$i.err'\n";
}
close(A);
Run Code Online (Sandbox Code Playgroud)
如何从各个命令获取退出状态值?
我正在尝试优化大型VC++项目的编译时间.我的处理器是Core i7 950(4核,8线程,因为它支持Intel超线程技术).
在Microsoft Visual Studio 2010中,如果转到"工具">"选项">"项目和解决方案">"VC++项目设置">"最大并发C++编译"
您可以选择用于并行C++编译的最大CPU内核.我在那里选择0(以便使用我的所有核心),这与使用4或8时产生完全相同的结果.
现在,如果我在编译项目时打开任务管理器,我可以看到4个并行编译线程正在运行(在进程下他们有描述:Microsoft C/C++编译器驱动程序),并且总CPU使用率略低于50%的所有时间.
所以我的问题是:
是否有可能在四核,超线程处理器中拥有8个并行编译线程?如果这是不可能的,那么在编译时是否有可能以某种方式使用接近100%的处理器功率?
这将为我节省大量时间.
非常感谢你提前,
尼古拉斯
c++ compiler-construction parallel-processing visual-studio-2010 hyperthreading
我写了一些代码:
class Program
{
public const int count = 3000;
static List<int> list = new List<int>();
static void DoWork(int i)
{
list.Add(i);
}
static void Main(string[] args)
{
while (true)
{
Stopwatch s = new Stopwatch();
s.Start();
Parallel.For(0, count + 1, DoWork);
s.Stop();
Console.WriteLine("\n Elapsed: " + s.Elapsed.ToString());
Console.WriteLine("Expected: {0}", count + 1);
Console.WriteLine("count: {0}", list.Count);
Console.ReadKey();
list = new List<int>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但结果不是预期的(
并非所有循环都在Console.WriteLine调用之前完成
使用Parallel.For有什么问题?
我正在使用pthreads编写一个C程序,在二维矩阵上进行波前模式计算.为了获得良好的性能,我以交错的方式向每个线程分配几行,如下所示:
线程0 ------------------
线程1 ------------------
线程2 ------------------
线程3 ------------------
线程0 ------------------
线程1 ------------------
线程2 ------------------
线程3 ------------------
等等
在这个计算中,我认为这是唯一可行的分割,因为每个线程需要在每一行上计算的新值,并且在它们可用之前不能进一步移动.现在,这里的问题是线程1需要在其行上由线程0计算的值,因此它必须在线程0后面跟踪而不是在它之前.为此,我将每一行分成块并用一个关键部分保护每个块.计算如下:
线程0 -----------
线程1 ------
线程2 ---
总是我必须排在第i - 1行后面.我希望你理解这个想法.我实现了这个想法,我正在一台双核四核系统的机器上进行测试.我遇到了奇怪的行为.结果是正确计算的,但运行时间在连续时间的8倍以内,最多超过连续时间.实际上,12000 x 12000矩阵的连续时间为16秒,并行运行时间为2到17秒之间,并且通常在两次连续运行时不同.
我最初的想法是这个问题非常敏感,所以当然,如果让线程0和线程1安排在不同的物理处理器上,我的性能可能会很差.在/ proc/cpuinfo中查看,我已经推断出核心被映射为0,2,4,6在处理器0上,而1,3,5,7在处理器1上.然后,在创建线程时,我有使用pthread_setaffinity_np设置右核上线程的亲和性.然而,没有任何改变.我也尝试过使用pthread_attr_setaffinity_np和sched_setaffinity,但我得到了相同的随机运行时间.
内核忽略了我的亲和力调用,或者这不是问题.我真的希望有人可以帮助我,因为我已经没有想法了.谢谢.
我的代码如下
public void DownloadConcurrent(Action<string> Methord)
{
Action<string>[] methordList = new Action<string>[Concurent_Downloads];
for (int i = 0; i < Concurent_Downloads; i++)
{
methordList[i] = Methord;
}
Parallel.Invoke(methordList);
}
Run Code Online (Sandbox Code Playgroud)
Parallel.Invoke给出了错误:
"cannot convert from 'System.Action<string>[]' to 'System.Action[]'"
Run Code Online (Sandbox Code Playgroud)
它调用的方法是
public void DownloadLinks(string Term)
{
}
Run Code Online (Sandbox Code Playgroud) 我有问题.
在另一个Parallel.ForEach中使用Parallel.Invoke有什么好处吗?
这是我的代码:
Parallel.ForEach(yearMonths,
() => new List<DJVSStatsCo>(),
(yearMonth, loopState, localDjvsStatsCo) =>
{
var coVintageCounter = 0;
var coExitsCounter = 0;
var coExtant = 0;
Parallel.Invoke(() =>
coVintageCounter = globalData.ValuationEventsPit.
Where(x => x.FirstRoundYearMonth <= yearMonth).
Select(x => x.CompanyId).Distinct().Count(),
() =>
coExitsCounter = globalData.ValuationEventsPit.
Where(x => x.ExitDate != null && x.ExitDateYearMonth == yearMonth).
Select(x => x.CompanyId).Distinct().Count(),
() =>
coExtant = globalData.ValuationEventsPit.
Where(x => x.FirstRoundYearMonth <= yearMonth && (x.ExitDate == null || x.ExitDateYearMonth > yearMonth)).
Select(x => x.CompanyId).Distinct().Count()
);
localDjvsStatsCo.Add(new DJVSStatsCo(yearMonth, coVintageCounter, …Run Code Online (Sandbox Code Playgroud) .net c# parallel-processing multithreading task-parallel-library
我一直在研究使用块在Objective-C中使用reduce [inject,fold,无论你想要什么称呼]函数的实现,并且想知道是否存在任何并行化计算的技术,其中所应用的函数是关联的(例如,a的总和)整数集合)?
也就是说,可以在NSArray上并行化或改进这样的东西:
- (id)reduceWithBlock:(id (^)(id memo, id obj))block andAccumulator:(id)accumulator
{
id acc = [[accumulator copy] autorelease];
for (id obj in self) {
acc = block(acc, obj);
}
return acc;
}
Run Code Online (Sandbox Code Playgroud)
使用大中央调度?
编辑:我已经进行了第二次尝试,将数组划分为更小的块并在单独的调度队列中减少它们,但在我的测试中没有明显的性能提升:( 这里的要点)
parallel-processing multithreading objective-c grand-central-dispatch objective-c-blocks
与此相关问题类似,我想在Vector上执行并行映射,但在我的情况下,我有一个嵌套的 Vector,我似乎无法使评估正确.
这是我到目前为止:
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import Data.Vector.Strategies
import Control.DeepSeq
main = do
let res = genVVec 200 `using` parVector 2
print res
genUVec :: Int -> U.Vector Int
genUVec n = U.map (ack 2) $ U.enumFromN n 75
genVVec :: Int -> V.Vector (U.Vector Int)
genVVec n = V.map genUVec $ V.enumFromN 0 n
ack :: Int -> Int -> Int
ack 0 n = n+1
ack m 0 …Run Code Online (Sandbox Code Playgroud)