标签: parallel-processing

Haskell中的多核编程 - Control.Parallel

我正在努力学习如何使用该Control.Parallel模块,但我认为我做得不对.

我正在尝试运行以下代码(fibs.hs).

import Control.Parallel

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = p `par` (q `pseq`  (p + q))
    where
      p = fib (n-1)
      q = fib (n-2)


main = print $ fib 30
Run Code Online (Sandbox Code Playgroud)

我编译了这个:

ghc -O2 --make -threaded fibs.hs
Run Code Online (Sandbox Code Playgroud)

然后我得到以下执行该程序的结果(输出每个程序100次的Python脚本并返回执行时间的平均值和标准差):

./fibs +RTS -N1 -> avg= 0.060203 s, deviation = 0.004112 s  
./fibs +RTS -N2 -> avg= 0.052335 s, deviation = 0.006713 s  
./fibs +RTS -N3 -> avg= …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading haskell multicore

10
推荐指数
2
解决办法
2283
查看次数

在PHP中并行执行函数

PHP可以调用函数而不是等待它返回吗?所以像这样:

function callback($pause, $arg) {
    sleep($pause);
    echo $arg, "\n";
}

header('Content-Type: text/plain');
fast_call_user_func_array('callback', array(3, 'three'));
fast_call_user_func_array('callback', array(2, 'two'));
fast_call_user_func_array('callback', array(1, 'one'));
Run Code Online (Sandbox Code Playgroud)

会输出

one (after 1 second)
two (after 2 seconds)
three (after 3 seconds)
Run Code Online (Sandbox Code Playgroud)

而不是

three (after 3 seconds)
two (after 3 + 2 = 5 seconds)
one (after 3 + 2 + 1 = 6 seconds)
Run Code Online (Sandbox Code Playgroud)

主脚本旨在作为永久进程(TCP服务器)运行.callback()函数将从客户端接收数据,执行外部PHP脚本,然后根据传递给的其他参数执行某些操作callback().问题是主脚本不能等待外部PHP脚本完成.外部脚本的结果很重要,因此exec('php -f file.php &')不是一个选项.


编辑:许多人建议看看PCNTL,所以似乎可以实现这样的功能.PCNTL在Windows中不可用,我现在无法访问Linux机器,所以我无法测试它,但如果有这么多人建议它,那么应该这样做:)

感谢大家!

php parallel-processing

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

什么是事件循环?它与使用其他模型有什么不同?

我一直在研究Node.JS,所有的文档和博客都讨论了它如何使用事件循环而不是每个请求模型.

我对这种差异有一些困惑.我觉得我80%有理解但尚未完全掌握它.

javascript parallel-processing functional-programming node.js

10
推荐指数
2
解决办法
4894
查看次数

并行执行查询会导致"基础提供程序在打开时失败".错误

有时,并非总是如此,我遇到了以下错误:"底层提供程序在打开时失败了."

这是我的情况:

我有一个并行处理的整数键列表,用作编译的选择查询中的参数.我在RIA域服务中使用它.

var queryResult = new List<int> {1, 2, 3}.AsParallel().Select(i => CompiledQueries.GetRecordByKey(this.ObjectContext, i)).ToList();
Run Code Online (Sandbox Code Playgroud)

这是编译的查询的样子:

public static IEnumerable<CompiledQueryResult> GetRecordByKey(MyEntities _context, int _key)
    {
        if (_getRecordByKey == null)
        {
            _getRecordByKey = CompiledQuery.Compile<MyEntities, int, IEnumerable<CompiledQueryResult>>
                ((ctx, key) =>
                    ctx.Records
                    .Where(r => r.Id == key)
                    .Select(r => new CompiledQueryResult
                    {
                        Id = r.ID,
                        Name = r.Name,
                        ...
                    })
                );
        }
        return _getRecordByKey.Invoke(_context, _key);
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用EF4,RIA(实际上domainservice的ObjectContext被传递给编译的查询方法),连接字符串包含着名的MultipleActiveResultSets = True ...当MultipleActiveResultSets设置为false时,我立即得到错误.

这里使用的代码是真实代码的简化版本.我也传递了更多的键,因此更多的并行查询..有时我在内部异常中看到数据读取器正在关闭,但状态是连接..
我试图扩大连接池大小,但没有成功.

有没有好的建议来解决这个问题?Thx提前.

.net parallel-processing ria linq.compiledquery

10
推荐指数
1
解决办法
3154
查看次数

OpenMP - 在并行代码中运行并行代码

我有一个compute()使用OpenMP在其内部并行化矩阵乘法的函数

#pragma omp parallel for
Run Code Online (Sandbox Code Playgroud)

这个函数在循环中被多次调用 - 我想并行运行.在其他并行代码中运行并行代码会有任何问题吗?

这是在Ubuntu上编译的c ++.

c++ parallel-processing openmp

10
推荐指数
1
解决办法
864
查看次数

Parallels.ForEach与Foreach相同的时间

所有,

我使用Parallels.ForEach如下

private void fillEventDifferencesParallels(IProducerConsumerCollection<IEvent> events, Dictionary<string, IEvent> originalEvents)
    {
        Parallel.ForEach<IEvent>(events, evt =>
        {
            IEvent originalEventInfo = originalEvents[evt.EventID];
            evt.FillDifferences(originalEventInfo);
        });
    }
Run Code Online (Sandbox Code Playgroud)

好的,所以我遇到的问题是我有28个这样的列表(一个测试样本,这应该可以扩展到200+)和FillDifferences方法非常耗时(每次调用大约4s).因此,在普通ForEach中运行的平均时间大约为100-130秒.当我在Parallel中运行相同的东西时,它需要相同的时间和Spikes我的CPU(Intel I5,2 Core,每个Core 2个线程)导致应用程序在此查询运行时变得迟缓(这是在一个线程上运行这是由GUI线程产生的).

所以我的问题是,我做错了什么导致这花费相同的时间?我读到List不是线程安全的所以我重写了这个以使用IProducerConsumerCollection.是否有任何其他陷阱可能导致这种情况?

FillDifferences方法调用一个静态类,该类使用反射来找出原始对象和修改对象之间存在多少差异.静态对象没有"全局"变量,只有被调用方法的局部变量.

有些人想看看FillDifferences()方法调用了什么.这是最终结束的地方:

  public  List<IDifferences> ShallowCompare(object orig, object changed, string currentName)
    {
        List<IDifferences> differences = new List<IDifferences>();
        foreach (MemberInfo m in orig.GetType().GetMembers())
        {
            List<IDifferences> temp = null;

            //Go through all MemberInfos until you find one that is a Property.
            if (m.MemberType == MemberTypes.Property)
            {
                PropertyInfo p = (PropertyInfo)m;
                string newCurrentName = "";
                if (currentName != …
Run Code Online (Sandbox Code Playgroud)

.net c# parallel-processing task-parallel-library

10
推荐指数
1
解决办法
2138
查看次数

算法是否受到并行性影响的大符号?

我刚读了一篇关于矩阵乘法突破的文章; 一个算法是O(n ^ 2.373).但我猜矩阵乘法是可以并行化的东西.那么,如果我们开始生产千分之一核处理器,这会变得无关紧要吗?事情会怎样改变?

algorithm parallel-processing big-o

10
推荐指数
3
解决办法
2155
查看次数

如何在bash脚本中使用并行编程/多线程?

这是我的脚本:

#!/bin/bash
#script to loop through directories to merge fastq files
sourcedir=/path/to/source
destdir=/path/to/dest

for f in $sourcedir/*
do
    fbase=$(basename "$f")
    echo "Inside $fbase"
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz
done
Run Code Online (Sandbox Code Playgroud)

这里目录'source'中有大约30个子目录.每个子目录都有一些R1 .fastq.gz文件和R2 .fastq.gz,我想将它们合并到一个R1.fastq.gz和R2.fastq.gz文件中,然后将合并后的文件保存到目标目录.我的代码工作正常,但由于数据量的原因,我需要加快速度.我只想知道有什么办法可以在我的脚本中实现多线程编程吗?如何运行我的脚本以便多个作业并行运行?bash脚本新手,所以任何帮助将不胜感激.

parallel-processing bash multithreading fastq

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

如何将对象导出到R中函数内的并行集群

我正在编写一个函数来组合和组织数据,然后使用基数R中的并行函数并行运行MCMC链.我的函数如下.

dm100zip <- function(y, n.burn = 1, n.it = 3000, n.thin = 1) {
  y <- array(c(as.matrix(y[,2:9]), as.matrix(y[ ,10:17])), c(length(y$Plot), 8, 2))
  nplots <- nrow(y)
  ncap1 <- apply(y[,1:8, 1],1,sum)
  ncap2 <- apply(y[,1:8, 2],1,sum)
  ncap <- as.matrix(cbind(ncap1, ncap2))
  ymax1 <- apply(y[,1:8, 1],1,sum)
  ymax2 <- apply(y[,1:8, 2],1,sum)

  # Bundle data for JAGS/BUGS
  jdata100 <- list(y=y, nplots=nplots, ncap=ncap)

  # Set initial values for Gibbs sampler
  inits100 <- function(){
    list(p0=runif(1, 1.1, 2),
      p.precip=runif(1, 0, 0.1),
      p.day = runif(1, -.5, 0.1))
  }

  # Set parameters …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r function

10
推荐指数
1
解决办法
9944
查看次数

排除在jUnit中并行运行的特定测试

我最近偶然发现了一种通过在java项目的pom.xml文件中指定以下内容来通过jUnit并行执行测试的简单方法:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <configuration>
  <parallel>classes</parallel>
 </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我发现有两个测试类(让我们称之为"badtestclass1"和"badtestclass2")由于编写测试的方式而不断受到并行执行的惩罚.理想情况下,我会重构那些测试类以表现得更好,但在此期间,我想知道是否有一种漂亮的方法来"排除"这些特定类并行执行.基本上,是否有一种方法可以并行执行其他所有操作,然后按顺序执行其他操作(或其他顺序,无关紧要).会有类似下面的工作吗?

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <configuration>
  <parallel>classes</parallel>
  <excludes>
   <excludesFile>badtestclass1</excludesFile>
   <excludesFile>badtestclass2</excludesFile>
  </excludes>
 </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

java parallel-processing junit4 maven

10
推荐指数
3
解决办法
9083
查看次数