在我的程序中,我正在模拟大量迭代的N体系统.对于每次迭代,我生成一组6N坐标,我需要将其附加到文件,然后用于执行下一次迭代.代码是用C++编写的,目前使用ofstream的方法write()在每次迭代时以二进制格式写入数据.
我不是这个领域的专家,但我想改进这部分程序,因为我正在优化整个代码.我觉得与在每个周期写入计算结果相关的延迟会显着降低软件的性能.
我很困惑,因为我没有实际并行编程和低级文件I/O的经验.我想到了一些我想象的可以实现的抽象技术,因为我正在使用Unix操作系统编写现代(可能是多核)的机器:
mmap(文件大小可能很大,按GB的顺序,这种方法足够强大吗?)但是,我不知道如何最好地实施它们并适当地组合它们.
当串行执行随机森林时,它在我的系统上使用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) 两点 - 首先,示例是在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) 我在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语句的主体?希望我很清楚.谢谢
我在云上有一个带有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
所以我最近开始学习Scala并且一直在使用图形作为我的项目 - 改进我的Scala,并且它进展顺利 - 我已经设法轻松地并行化一些图形算法(从数据并行化中受益)由Scala 2.9提供并行收藏的惊人支持.
但是,我想更进一步,让它不仅在一台机器上而且在几台机器上并行化.Scala是否提供任何干净的方式来执行此操作,就像它对并行集合一样,或者我是否必须等到我的Actors中的章节/了解有关Akka的更多信息?
谢谢!-kstruct
parallel-processing distributed scala graph scala-collections
在C++ AMP中,内核函数或lambda标记为restrict(amp),这对C++的允许子集(此处列出)施加了严格的限制.CUDA是否允许内核函数中C或C++子集的更多自由?
我正在寻找一个很好的API来用于在GPU上实现算法.我更喜欢相关简单和灵活的东西.我不是在寻找最核心的表演,而是我可以玩的东西.另外我真的更喜欢在Nvidia和ATI卡上都有效的东西......
好的建议,特别是基于经验的建议可能会得到奖励.
目前我们讨论的算法是图像处理,即对非常大的矩阵的相关简单操作......
对我来说,我希望能够将PLINQ表达式带到GPU上,并且还有像System.Threading.Tasks.Parallel这样的API,它可以在GPU上执行...
我们大部分时间处于初步探索阶段......
再次工作跨平台几乎是一个要求......
如果在后台线程上运行以下代码,我怎么能在主线程上'ContinueWith'?
var task = Task.Factory.StartNew(() => Whatever());
task.ContinueWith(NeedThisMethodToBeOnUiThread), TaskScheduler.FromCurrentSynchronizationContext())
Run Code Online (Sandbox Code Playgroud)
以上操作无效,因为当前同步上下文已经是后台线程.
我希望运行我的并行程序
$ 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)
但它很难看.
非常感谢!:)