标签: parallel-processing

在生成数据时写入数据的最快方法

在我的程序中,我正在模拟大量迭代的N体系统.对于每次迭代,我生成一组6N坐标,我需要将其附加到文件,然后用于执行下一次迭代.代码是用C++编写的,目前使用ofstream的方法write()在每次迭代时以二进制格式写入数据.

我不是这个领域的专家,但我想改进这部分程序,因为我正在优化整个代码.我觉得与在每个周期写入计算结果相关的延迟会显着降低软件的性能.

我很困惑,因为我没有实际并行编程和低级文件I/O的经验.我想到了一些我想象的可以实现的抽象技术,因为我正在使用Unix操作系统编写现代(可能是多核)的机器:

  • 在n次迭代的块中写入文件中的数据(似乎有更好的方法继续......)
  • 使用OpenMP并行化代码(如何实际实现缓冲区以使线程正确同步,并且不重叠?)
  • 使用mmap(文件大小可能很大,按GB的顺序,这种方法足够强大吗?)

但是,我不知道如何最好地实施它们并适当地组合它们.

c++ parallel-processing optimization file-io

7
推荐指数
1
解决办法
4226
查看次数

使用doSMP和foreach的并行随机森林大大增加了内存使用量(在Windows上)

当串行执行随机森林时,它在我的系统上使用8GB的RAM,当并行执行它时,它使用超过两倍的RAM(18GB).如果并行执行此操作,如何将其保持在8GB?这是代码:

install.packages('foreach')
install.packages('doSMP')
install.packages('randomForest')

library('foreach')
library('doSMP')
library('randomForest')

NbrOfCores <- 8 
workers <- startWorkers(NbrOfCores) # number of cores
registerDoSMP(workers)
getDoParName() # check name of parallel backend
getDoParVersion() # check version of parallel backend
getDoParWorkers() # check number of workers


#creating data and setting options for random forests
#if your run this please adapt it so it won't crash your system! This amount of data  uses up to 18GB of RAM.
x <- matrix(runif(500000), 100000)
y <- gl(2, 50000)
#options
set.seed(1)
ntree=1000 …
Run Code Online (Sandbox Code Playgroud)

memory parallel-processing r random-forest

7
推荐指数
1
解决办法
1726
查看次数

随机数种子的可能来源

两点 - 首先,示例是在Fortran中,但我认为它应该适用于任何语言; 第二,内置的随机数生成器并不是真正随机的,而且存在其他生成器,但我们对于将它们用于我们正在做的事情并不感兴趣.

关于随机种子的大多数讨论都承认,如果程序在运行时没有播种,那么种子将在编译时生成.因此,每次运行程序时都会生成相同的数字序列,这对随机数不利.克服这个问题的一种方法是使用系统时钟为随机数发生器播种.

但是,当在多核机器上与MPI并行运行时,我们的系统时钟方法产生了同样的问题.当序列从运行变为运行时,所有处理器都获得相同的系统时钟,因此具有相同的随机种子和相同的序列.

请考虑以下示例代码:

PROGRAM clock_test
   IMPLICIT NONE
   INCLUDE "mpif.h"
   INTEGER :: ierr, rank, clock, i, n, method
   INTEGER, DIMENSION(:), ALLOCATABLE :: seed
   REAL(KIND=8) :: random
   INTEGER, PARAMETER :: OLD_METHOD = 0, &
                         NEW_METHOD = 1

   CALL MPI_INIT(ierr)

   CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

   CALL RANDOM_SEED(SIZE=n)
   ALLOCATE(seed(n))

   DO method = 0, 1
      SELECT CASE (method)
      CASE (OLD_METHOD)
         CALL SYSTEM_CLOCK(COUNT=clock)
         seed = clock + 37 * (/ (i - 1, i = 1, n) /)
         CALL RANDOM_SEED(put=seed)  
         CALL RANDOM_NUMBER(random)

         WRITE(*,*) …
Run Code Online (Sandbox Code Playgroud)

random parallel-processing multicore seed mpi

7
推荐指数
1
解决办法
6468
查看次数

MPI_Reduce阻塞(或天然屏障)?

我在C++中有下面的代码片段,它基本上使用经典的monte carlo技术来计算pi.

    srand48((unsigned)time(0) + my_rank);

    for(int i = 0 ; i < part_points; i++)
    {
            double x = drand48();

            double y = drand48();

            if( (pow(x,2)+pow(y,2)) < 1){ ++count; }
    }

    MPI_Reduce(&count, &total_hits, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);

    if(my_rank == root)
    {
            pi = 4*(total_hits/(double)total_points);

            cout << "Calculated pi: "  <<  pi << " in " << end_time-start_time <<  endl;
    }
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否需要MPI_Barrier调用.MPI_Reduce是否确保在reduce操作完成之前不会执行if语句的主体?希望我很清楚.谢谢

parallel-processing mpi

7
推荐指数
3
解决办法
6375
查看次数

使用SqlBulkCopy和Azure进行并行批量插入

我在云上有一个带有sql azure数据库的天蓝色应用程序.我有一个worker角色,需要对文件进行解析+处理(最多约3000万行),所以我不能直接使用BCP或SSIS.

我目前正在使用SqlBulkCopy,但是这看起来太慢了,因为我看到400k行的加载时间长达4-5分钟.

我希望并行运行我的批量插入; 然而,阅读有关并行/控制锁行为导入数据的文章,它说SqlBulkCopy要求表没有聚簇索引,并且需要指定表锁(BU锁).但是,azure表必须具有聚簇索引...

甚至可以在SQL Azure中的同一个表上并行使用SqlBulkCopy吗?如果没有,那么还有另一个API(我可以在代码中使用)吗?

database parallel-processing sqlbulkcopy azure azure-sql-database

7
推荐指数
1
解决办法
4167
查看次数

在群集上分发Scala?

所以我最近开始学习Scala并且一直在使用图形作为我的项目 - 改进我的Scala,并且它进展顺利 - 我已经设法轻松地并行化一些图形算法(从数据并行化中受益)由Scala 2.9提供并行收藏的惊人支持.

但是,我想更进一步,让它不仅在一台机器上而且在几台机器上并行化.Scala是否提供任何干净的方式来执行此操作,就像它对并行集合一样,或者我是否必须等到我的Actors中的章节/了解有关Akka的更多信息?

谢谢!-kstruct

parallel-processing distributed scala graph scala-collections

7
推荐指数
1
解决办法
961
查看次数

限制(amp)比CUDA内核代码更具​​限制性吗?

在C++ AMP中,内核函数或lambda标记为restrict(amp),这对C++的允许子集(此处列出)施加了严格的限制.CUDA是否允许内核函数中C或C++子集的更多自由?

parallel-processing cuda gpu-programming c++-amp

7
推荐指数
1
解决办法
900
查看次数

寻找一个API来利用.NET的GPU的强大功能

我正在寻找一个很好的API来用于在GPU上实现算法.我更喜欢相关简单和灵活的东西.我不是在寻找最核心的表演,而是我可以玩的东西.另外我真的更喜欢在Nvidia和ATI卡上都有效的东西......


好的建议,特别是基于经验的建议可能会得到奖励.


目前我们讨论的算法是图像处理,即对非常大的矩阵的相关简单操作......

对我来说,我希望能够将PLINQ表达式带到GPU上,并且还有像System.Threading.Tasks.Parallel这样的API,它可以在GPU上执行...

我们大部分时间处于初步探索阶段......

再次工作跨平台几乎是一个要求......

.net c# parallel-processing gpu gpu-programming

7
推荐指数
1
解决办法
903
查看次数

UI线程上的任务继续,从后台线程启动时

如果在后台线程上运行以下代码,我怎么能在主线程上'ContinueWith'?

  var task = Task.Factory.StartNew(() => Whatever());
  task.ContinueWith(NeedThisMethodToBeOnUiThread), TaskScheduler.FromCurrentSynchronizationContext())
Run Code Online (Sandbox Code Playgroud)

以上操作无效,因为当前同步上下文已经是后台线程.

c# parallel-processing task-parallel-library c#-4.0

7
推荐指数
1
解决办法
5716
查看次数

如何在运行时设置线程数(避免+ RTS -N#)

我希望运行我的并行程序

$ myprogram <args> -n 4 <args>
Run Code Online (Sandbox Code Playgroud)

代替

$ myprogram <args> +RTS -N4 -RTS <args>
Run Code Online (Sandbox Code Playgroud)

主要原因是规范我的程序的参数格式.

我知道它可以做到

$ myprogramwrapper <args> -n 4 <args>
$ cat myprogramwrapper
#!/bin/bash
ARG1=parse args
ARG2=...
NCORES=....
myprogram $ARG1 ... +RTS -N$NCORES
Run Code Online (Sandbox Code Playgroud)

但它很难看.

非常感谢!:)

parallel-processing haskell

7
推荐指数
1
解决办法
201
查看次数