标签: parallel-processing

如何获得任务并行库使用的最大并行度?

我想使用Parallel.invoke.如果我分配20个并行任务,则只有8个并发运行.我的CPU是http://ark.intel.com/products/47925,并且报告的线程数是8.我假设可以并行运行的任务数与线程的cpu数有关.我不想创建比线程数更多的任务.我怎么知道c#中的线程数?我尝试查询ParallelOptions.MaxDegreeOfParallelism,我得到的只是-1.

c# parallel-processing multithreading task-parallel-library

5
推荐指数
1
解决办法
4060
查看次数

使用降雪进行并行计算时为什么不进行负载平衡?

很长一段时间以来,我一直在使用sfLapply来处理很多并行r脚本.然而,最近我已经深入研究并行计算,我一直在使用sfClusterApplyLB,如果单个实例不需要花费相同的时间来运行,那么可以节省大量时间.如果sfLapply将在加载新批处理之前等待批处理的每个实例完成(这可能导致空闲实例),完成任务的sfClusterApplyLB实例将立即分配给列表中的其余元素,因此可能会节省相当多的时间当实例没有花费相同的时间时.这让我质疑为什么我们在使用降雪时不想平衡我们的跑步?到目前为止我唯一发现的是,当并行脚本出现错误时,sfClusterApplyLB仍会在发出错误之前循环遍历整个列表,而sfLapply将在尝试第一批后停止.我还缺少什么?是否存在负载平衡的任何其他成本/缺点?下面是一个示例代码,显示了两者之间的差异

rm(list = ls()) #remove all past worksheet variables
working_dir="D:/temp/"
setwd(working_dir)
n_spp=16
spp_nmS=paste0("sp_",c(1:n_spp))
spp_nm=spp_nmS[1]
sp_parallel_run=function(sp_nm){
  sink(file(paste0(working_dir,sp_nm,"_log.txt"), open="wt"))#######NEW
  cat('\n', 'Started on ', date(), '\n') 
  ptm0 <- proc.time()
  jnk=round(runif(1)*8000000) #this is just a redundant script that takes an arbitrary amount of time to run
  jnk1=runif(jnk)
  for (i in 1:length(jnk1)){
    jnk1[i]=jnk[i]*runif(1)
  }
  ptm1=proc.time() - ptm0
  jnk=as.numeric(ptm1[3])
  cat('\n','It took ', jnk, "seconds to model", sp_nm)

  #stop sinks
  sink.reset <- function(){
    for(i in seq_len(sink.number())){
      sink(NULL)
    }
  }
  sink.reset()
}
require(snowfall)
cpucores=as.integer(Sys.getenv('NUMBER_OF_PROCESSORS'))

sfInit( parallel=T, cpus=cpucores) # …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r snowfall

5
推荐指数
1
解决办法
409
查看次数

Seed和clusterApply-如何选择特定的运行?

我正在大型数据集(636,688行x 7列)上执行k-均值,因此转向并行化。我的结果需要可重现。我可以用做clusterSetRNGStreamparallel包。这是一个使用库中Boston数据集的示例MASS

library(parallel)
cl <- makeCluster(detectCores())
clusterSetRNGStream(cl, iseed = 1234)
clusterEvalQ(cl, library(MASS))
results <- clusterApply(cl, rep(25, 4), function(nstart) kmeans(Boston, 4, nstart = nstart))
check.results <- sapply(results, function(result) result$size)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

check.results列表示对于k-means算法的给定遍历,每个相应群集的观察次数。check.results然后,我的样子如下:

     [,1] [,2] [,3] [,4]
[1,]   38  268  102  102
[2,]  268   98   98   38
[3,]   98  102   38  268
[4,]  102   38  268   98
Run Code Online (Sandbox Code Playgroud)

如果将results变量更改为include rep(25, 2)而不是rep(25, 4),则会得到:

     [,1] [,2]
[1,]   38  268 …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r k-means

5
推荐指数
1
解决办法
1055
查看次数

如果GetOrAdd忙于检索具有相同密钥的值,它是否会等待?

考虑以下代码:

void DoSomething(int key)
{
    concurrentDictionary.GetOrAdd(key, (k)=>
        {
            //Do some expensive over network and database to retrieve value.
        });
Run Code Online (Sandbox Code Playgroud)

考虑2个线程正在调用DoSomething(2).同时他们会看到Key==2字典中没有项目.考虑Thread1开始使用昂贵的算法来检索值2.

问题1:请问Thread2等待Thread1来完成它的工作?或者只是尝试检索值本身,并在将其添加到字典时将其丢弃?(Thread1已经添加了这个)

问题2:如果Thread2不等待,避免多次运行该昂贵算法的最佳解决方案是什么?

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

5
推荐指数
1
解决办法
151
查看次数

Powershell:不要等待功能返回

我有一个Powershell脚本,我正在调用一个名为generate_html的函数.

有没有办法在继续下一个函数调用之前调用函数而不等待它返回?

我宁愿不必将其分解为多个脚本并同时运行这些脚本.

function generate_html($var)
{
...
}

generate_html team1
generate_html team2
Run Code Online (Sandbox Code Playgroud)

parallel-processing powershell

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

NUMA系统,虚拟页面和虚假共享

据我所知,对于NUMA系统的性能,有两种情况需要避免:

  1. 同一个套接字中的线程写入同一个缓存行(通常为64个字节)
  2. 来自不同套接字的线程写入同一个虚拟页面(通常为4096字节)

一个简单的例子会有帮助.假设我有一个双插槽系统,每个插槽都有一个带有两个物理内核的CPU(和两个逻辑内核,即每个模块没有Intel超线程或AMD两个内核).让我借一下OpenMP的数据:按计划进行

| socket 0    | core 0 | thread 0 |
|             | core 1 | thread 1 |

| socket 1    | core 2 | thread 2 |
|             | core 3 | thread 3 |
Run Code Online (Sandbox Code Playgroud)

因此,基于案例1,最好避免例如线程0和线程1写入相同的高速缓存行,并且基于案例2,最好避免例如线程0写入与线程2相同的虚拟页面.

但是,我被告知在现代处理器上,第二种情况不再是一个问题.套接字之间的线程可以有效地写入同一个虚拟页面(只要它们不写入同一个缓存行).

案例二不再是问题吗?如果仍然存在问题,那么正确的术语是什么?将这两种情况称为虚假共享是否正确?

parallel-processing multithreading openmp numa

5
推荐指数
1
解决办法
317
查看次数

如何编辑和重新构建GCC libstdc ++ C++标准库源代码?

我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验.具体而言,我对试验并行排序算法感兴趣.有没有一个地方我可以找到文档来轻松编辑和构建源代码?

我试过构建各种版本的libstdc ++库,但没有成功.似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件.

我也一直无法找到包含并行排序算法的源文件.我似乎只能找到定义函数的头文件,而不是源代码本身.任何建议或文档链接将不胜感激.

c++ parallel-processing gcc stl libstdc++

5
推荐指数
2
解决办法
3521
查看次数

Maven surfire测试reusefork vs parallel

现在我有一个完整的项目,我想在maven中并行测试.如果我设置并行选项,则我的测试失败原因DirtiesContexts.(即使我注释了测试类@DirtiesContext(classMode=ClassMode.AFTER_CLASS))

我没有把堆栈跟踪放在这里,但它无法加载applicationcontext,导致他无法注册applicationcontext,因为它已经存在.

如果我使用reusefork,即使没有注释,测试也会成功DirtiesContext.

当您使用reusefork时,您将为每个fork创建总是新的VM(这就是它成功的原因).(请参阅此处的文档:http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html)

通过并行,您不会这样做,所以通常这将需要更少的资源.

那么现在问题是:

  1. doc的链接仅与TestNG并行,但在这里他们谈到JUnit 4.7及更高版本,所以我很困惑,什么是正确的文档?
  2. 并行测试是否更好dan reusefork?
  3. 如果它更好,我该如何解决DirtiesContext

Thx提前.

java parallel-processing junit4 maven applicationcontext

5
推荐指数
1
解决办法
536
查看次数

将执行从一个线程移动到另一个线程以实现任务并行和逐个调用

我正在尝试在C++中实现一个call-by-future机制.虽然这只是一个测试代码(有点匆忙),但我打算使用类似于我正在研究的语言运行时的透明并行性.

我已经干了我正在努力的代码,使它变得更小,尽管它仍然很大:

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <future>
#include <thread>
#include <functional>
#include <type_traits>
#include <utility>
using namespace std;
using namespace std::chrono;

//------------------------------------------------------------------------------
// Simple locked printer

static std::recursive_mutex print_lock;

inline void print_() {
  return;
};

template<typename T, typename... Args>
inline void print_(T t, Args... args) {
  print_lock.lock();
  std::cout << t;
  print_(args...);
  print_lock.unlock();
};
//------------------------------------------------------------------------------

template<typename R>
class PooledTask {
  public:
    explicit PooledTask(function<R()>);

    // Possibly execute the task and return the value
    R &operator …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing concurrency multithreading c++11

5
推荐指数
1
解决办法
1273
查看次数

犰狳的并行化

犰狳C++线性代数库文件规定的原因,发展中国家在C++库是一个"通过目前的OpenMP易于并行化的现代C++编译器",但犰狳代码不使用OpenMP的.如何获得与Armadillo并行化的好处?这是通过使用高速LAPACK和BLAS替换之一实现的吗?我的平台是Linux,Intel处理器,但我怀疑这个问题有一个通用的答案.

c++ parallel-processing blas armadillo

5
推荐指数
1
解决办法
3304
查看次数