编辑其他选项和下面稍微扩展的问题.
考虑一个类体的这个人为的抽象例子.它演示了执行"for"迭代的四种不同方法.
private abstract class SomeClass
{
public void someAction();
}
void Examples()
{
List<SomeClass> someList = new List<SomeClass>();
//A. for
for (int i = 0; i < someList.Count(); i++)
{
someList[i].someAction();
}
//B. foreach
foreach (SomeClass o in someList)
{
o.someAction();
}
//C. foreach extension
someList.ForEach(o => o.someAction());
//D. plinq
someList.AsParallel().ForAll(o => o.someAction());
Run Code Online (Sandbox Code Playgroud)
编辑:从答案和研究中添加一些选项.
//E. ParallelEnumerable
ParallelEnumerable.Range(0, someList.Count - 1)
.ForAll(i => someList[i].someAction());
//F. ForEach Parallel Extension
Parallel.ForEach(someList, o => o.someAction());
//G. For Parallel Extension
Parallel.For(0, someList.Count …Run Code Online (Sandbox Code Playgroud) 有人可以提供一些建议,说明如何通过多线程减少循环运行时的以下内容?假设我还有两个名为'a'和'b'的向量.
for (int j = 0; j < 8000; j++){
// Perform an operation and store in the vector 'a'
// Add 'a' to 'b' coefficient wise
}
Run Code Online (Sandbox Code Playgroud)
这个for循环在我的程序中执行了很多次.上面for循环中的两个操作已经过优化,但它们只在一个核心上运行.但是,我有16个核心,并且想要使用它们.
我试过按如下方式修改循环.我没有向量'a',而是有16个向量,并假设第i个被称为a [i].我的for循环现在看起来像
for (int j = 0; j < 500; j++){
for (int i = 0; i < 16; i++){
// Perform an operation and store in the vector 'a[i]'
}
for (int i = 0; i < 16; i++){
// Add 'a[i]' to 'b' coefficient wise
}
}
Run Code Online (Sandbox Code Playgroud)
我在每个for循环中使用OpenMp,在每个内循环之前添加'#pragma omp …
我有一个data.frame的单元格,值和坐标.它驻留在全球环境中.
> head(cont.values)
cell value x y
1 11117 NA -34 322
2 11118 NA -30 322
3 11119 NA -26 322
4 11120 NA -22 322
5 11121 NA -18 322
6 11122 NA -14 322
Run Code Online (Sandbox Code Playgroud)
因为我的自定义函数花了将近一秒来计算单个单元格(我需要计算数万个单元格),我不想复制已经有值的单元格的计算.以下解决方案试图避免这种情况.每个单元格可以独立计算,尖叫为并行执行.
我的函数实际上做的是检查是否有指定单元格编号的值,如果它是NA,则计算它并将其插入代替NA.
我可以使用apply函数系列来运行我的魔术函数(结果是value相应的cell),从内部apply,我可以读写cont.values没有问题(它在全局环境中).
现在,我想并行运行(使用snowfall),我无法从单个核心读取或写入此变量.
问题:在并行执行函数时,从工作者(核心)内部驻留在全局环境中的动态变量可以读取/写入什么解决方案.这样做有更好的方法吗?
我有以下要求:
我可以将perl代码整合在一起,大致可以做到这一点,但我想要一个更优雅的解决方案.
我在Matlab中运行parfor循环需要花费很多时间,我想知道剩下多少次迭代.我怎样才能获得这些信息?
使用单一ExecutorService和多个CompletionService使用相同线程池的实例是否安全?
CompletionService<Object> collector = new ExecutorCompletionService<Object>(threadPool);
Run Code Online (Sandbox Code Playgroud)
因此,将有多个线程创建上面的实例,'collector'与一个singleton threadPool.
我想让ddply在我的mac上并行运行.我使用的代码如下:
library(doMC)
library(ggplot2) # for the purposes of getting the baseball data.frame
registerDoMC(2)
> system.time(ddply(baseball, .(year), numcolwise(mean)))
user system elapsed
0.959 0.106 1.522
> system.time(ddply(baseball, .(year), numcolwise(mean), .parallel=TRUE))
user system elapsed
2.221 2.790 2.552
Run Code Online (Sandbox Code Playgroud)
当我运行.parallel = TRUE时为什么ddply会变慢?我在网上搜索无济于事.我也尝试registerDoMC()了,结果是一样的.
我有一个由OpenMP并行化的循环,但由于任务的性质,有4个critical子句.
什么是最好的方式来分析加速,找出哪些关键条款(或可能非关键(!))占用循环内的最多时间?
我使用Ubuntu 10.04和g ++ 4.4.3
就像标题所说的那样.我有一段代码如下:
pid_t = p;
p = fork();
if (p == 0) {
childfn();
} else if (p > 0) {
parentfn();
} else {
// error
}
Run Code Online (Sandbox Code Playgroud)
我想确保父或子在另一个之前执行(但不返回)各自的功能.
像sleep()这样的调用可能会起作用,但是不能通过任何标准来保证,并且只是利用操作系统调度程序的实现细节......这可能吗?vfork会工作吗?
编辑:两个函数都找到了一个system()调用,其中一个函数在另一个函数启动之前不会返回.所以要重新迭代:我需要确保父或子只调用它们各自的函数(但不返回,因为它们不会,这是下面提供的所有基于互斥锁的解决方案提供的).有任何想法吗?抱歉缺乏清晰度.
edit2:有一个进程调用sched_yield和sleep,我似乎得到了非常可靠的结果.vfork确实提供了我正在寻找的语义,但是对于我在子进程中可以做的事情有很多限制(我几乎只能调用exec).所以,我发现了一些足够好的解决方案,但没有真正的解决方案.vfork可能是我所寻找的最接近的东西,但下面提出的所有解决方案都会或多或少地起作用.
我正在重构前一段时间编写的代码,当linq和delegates不存在时,很多代码都是令人尴尬的并行化,所以AsParallel我随时都可以使用但是我不太确定当涉及到有序列表时会发生什么在这样的查询中.例如,
/* suppose we have the following list
SortedList<DateTime, SomeClass> list1
*/
var projection = list1.AsParallel().Select(t => t.Key);
var skippedProjection = list1.AsParallel().Select(t => t.Key).Skip(1);
var zipped = projection.AsParallel().Zip(skippedProjection, someComputation);
Run Code Online (Sandbox Code Playgroud)
我的问题如下:并行查询中是否保留了排序?换句话说,上面的示例是否会按照我的预期工作,或者Select后续查询会AsParallel以随机顺序返回事物,具体取决于幕后使用的策略?