标签: parallel-processing

使用MPI_Type_create_subarray发送时可以转置数组吗?

我正在尝试使用C中的MPI转置矩阵.每个进程都有一个方形子矩阵,我想将它发送到正确的进程(网格上的"对面"),将其转换为通信的一部分.

我正在使用MPI_Type_create_subarray哪个有订单的参数,MPI_ORDER_C或者分别MPI_ORDER_FORTRAN用于行主要和列主要.我认为,如果我作为其中一个发送,并作为另一个接收,那么我的矩阵将被转换为通信的一部分.然而,这似乎并没有发生 - 它只是保持非转置.

下面是代码的重要部分,整个代码文件都可以在这个要点中找到.有没有人有任何想法为什么这不起作用?这种方法是否应该进行转置工作?我还以为它会,看过的描述MPI_ORDER_CMPI_ORDER_FORTRAN,但也许不是.

/* ----------- DO TRANSPOSE ----------- */
/* Find the opposite co-ordinates (as we know it's a square) */
coords2[0] = coords[1];
coords2[1] = coords[0];

/* Get the rank for this process */
MPI_Cart_rank(cart_comm, coords2, &rank2);

/* Send to these new coordinates */

tag = (coords[0] + 1) * (coords[1] + 1);

/* Create new derived type to receive as */
/* MPI_Type_vector(rows_in_core, cols_in_core, …
Run Code Online (Sandbox Code Playgroud)

c parallel-processing hpc mpi openmpi

6
推荐指数
1
解决办法
2837
查看次数

熵和并行随机数发生器播种

我有一个循环,我在某些点添加噪音; 这些后来被用作一些统计测试的基础.

涉及的数据集非常大,所以我想使用openMP将其并行化以加快速度.当我想拥有多个PRNG时,问题出现了.我有自己的PRNG类基于NR的模数方法(我认为是rand4),但我不确定如何正确播种PRNG以确保适当的熵

Normalliy我会做这样的事情

prng.initTimer();
Run Code Online (Sandbox Code Playgroud)

但是如果我有一个prng数组,每个工作线程一个,那么我不能简单地在每个实例上调用initTimer - 定时器可能不会改变,并且定时器关闭可能会引入相关性.

我需要防止自然关联,而不是针对恶意攻击者(这是实验数据),所以我需要有一种安全的方式来播种rng数组.

我想过简单地使用

prng[0].initTimer()
for(int i=1; i<numRNGs; i++)
     prng[i].init(prng[0].getRandNum());
Run Code Online (Sandbox Code Playgroud)

然后调用我的循环,但不确定这是否会在模数方法中引入相关性.

c++ math parallel-processing statistics

6
推荐指数
1
解决办法
472
查看次数

什么时候用哪个?

编辑其他选项和下面稍微扩展的问题.

考虑一个类体的这个人为的抽象例子.它演示了执行"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)

.net c# iteration parallel-processing .net-4.0

6
推荐指数
1
解决办法
439
查看次数

向量的并行和

有人可以提供一些建议,说明如何通过多线程减少循环运行时的以下内容?假设我还有两个名为'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 …

c++ parallel-processing multithreading openmp

6
推荐指数
1
解决办法
2126
查看次数

并行运行时写入全局环境

我有一个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),我无法从单个核心读取或写入此变量.

问题:在并行执行函数时,从工作者(核心)内部驻留在全局环境中的动态变量可以读取/写入什么解决方案.这样做有更好的方法吗?

parallel-processing r snowfall

6
推荐指数
1
解决办法
2841
查看次数

我应该如何在Perl中实现原子序列?

我有以下要求:

  1. 该序列对于主机是唯一的(不需要共享递增)
  2. 序列必须单调递增.
  3. 序列必须在整个进程中保持不变.
  4. 在多个进程同时处理它的情况下,递增序列必须是原子的.
  5. 大多数情况下,文件将更新,更新后读取新值.但是,也应该可以在不更新的情况下读取当前值.

我可以将perl代码整合在一起,大致可以做到这一点,但我想要一个更优雅的解决方案.

parallel-processing perl sequences atomic

6
推荐指数
1
解决办法
780
查看次数

使用线程C#

我需要一些帮助来试图弄清楚我做错了什么.我正在尝试从单独的线程中获取系统日志中的项集合,以防止表单在收集过程中被冻结.我可以让后台工作者抓住它们,但我有一些问题将它们添加到ListBox表单上.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

  foreach (System.Diagnostics.EventLogEntry entry in eventLog1.Entries)
  {
     listBox1.Items.Add(
        entry.EntryType.ToString() + " - " + 
        entry.TimeWritten + "     - " + 
        entry.Source);
  }
}
Run Code Online (Sandbox Code Playgroud)

显然这不会按预期工作,因为有2个单独的线程,你不能像我发现的那样更改不同线程上的对象.所以,如果有人能指导我朝着正确的方向前进,我会感激不尽.

c# parallel-processing multithreading listbox winforms

6
推荐指数
1
解决办法
387
查看次数

MapReduce是否适合解决单机多核内存环境中的问题?

MapReduce抽象是否适用于处理即使在单个机器中的问题?例如,我有一个12核的机器,我必须计算数千个文件中的单词(经典的MapReduce示例).

考虑到我们正在使用单个硬盘驱动器的单台机器上工作,在多线程中使用Mapper和Reducers的MapReduce实现是解决此问题的好方法吗?

我想我的问题归结为:MapReduce范例仅适用于在一组机器中工作吗?

algorithm parallel-processing concurrency mapreduce

6
推荐指数
2
解决办法
2643
查看次数

为什么不使用 boot.ci 进行并行加速以获得 BCa 置信区间?

这个问题的答案的底部(使用 R 中的约束计算固定效应的 CI)建议人们应该看到user时间 >elapsed并行工作时的时间。尽管parallel = "multicore", ncpus = 4在运行时指定了boot.ci我没有看到那个结果。此外,我在 Mac 的活动监视器运行时只看到大约 30% 的 CPU 负载。这是否意味着我不能与我的 4 核 iMac 进行并行处理?如果没有,关于让它工作的任何建议?

下面是一个例子:

library(car)
library(boot)
set.seed(47)

 y <- rgamma(2000, 2)
 x1 <- 3 * y + rnorm(2000)
 x2 <- y^2 + rnorm(2000)
 x3 <- rnorm(2000)
 MyData <- data.frame(c(y, x1, x2, x3))
 MyModel <- lm(y ~ x1 + x2 + x3, data = MyData)
# Boot doesn't have a parallel option that I …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r statistics-bootstrap

6
推荐指数
0
解决办法
527
查看次数

朱莉娅 pmap 性能

我正在尝试将我的一些 R 代码移植到 Julia;基本上我已经在 J​​ulia 中重写了以下 R 代码:

library(parallel)

eps_1<-rnorm(1000000)
eps_2<-rnorm(1000000)

large_matrix<-ifelse(cbind(eps_1,eps_2)>0,1,0)
matrix_to_compare = expand.grid(c(0,1),c(0,1))
indices<-seq(1,1000000,4)
large_matrix<-lapply(indices,function(i)(large_matrix[i:(i+3),]))

function_compare<-function(x){
  which((rowSums(x==matrix_to_compare)==2) %in% TRUE)
}

> system.time(lapply(large_matrix,function_compare))
   user  system elapsed 
 38.812   0.024  38.828 
> system.time(mclapply(large_matrix,function_compare,mc.cores=11))
   user  system elapsed 
 63.128   1.648   6.108 
Run Code Online (Sandbox Code Playgroud)

正如人们所注意到的,当从 1 个内核变为 11 个内核时,我获得了显着的加速。现在我正尝试在 Julia 中做同样的事情:

#Define cluster:

addprocs(11);

using Distributions;
@everywhere using Iterators;
d = Normal();

eps_1 = rand(d,1000000);
eps_2 = rand(d,1000000);


#Create a large matrix:
large_matrix = hcat(eps_1,eps_2).>=0;
indices = collect(1:4:1000000)

#Split large matrix:
large_matrix = [large_matrix[i:(i+3),:] for i …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r pmap julia mclapply

6
推荐指数
1
解决办法
628
查看次数