我想使用Parallel.invoke.如果我分配20个并行任务,则只有8个并发运行.我的CPU是http://ark.intel.com/products/47925,并且报告的线程数是8.我假设可以并行运行的任务数与线程的cpu数有关.我不想创建比线程数更多的任务.我怎么知道c#中的线程数?我尝试查询ParallelOptions.MaxDegreeOfParallelism,我得到的只是-1.
很长一段时间以来,我一直在使用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) 我正在大型数据集(636,688行x 7列)上执行k-均值,因此转向并行化。我的结果需要可重现。我可以用做clusterSetRNGStream从parallel包。这是一个使用库中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) 考虑以下代码:
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
我有一个Powershell脚本,我正在调用一个名为generate_html的函数.
有没有办法在继续下一个函数调用之前调用函数而不等待它返回?
我宁愿不必将其分解为多个脚本并同时运行这些脚本.
function generate_html($var)
{
...
}
generate_html team1
generate_html team2
Run Code Online (Sandbox Code Playgroud) 据我所知,对于NUMA系统的性能,有两种情况需要避免:
一个简单的例子会有帮助.假设我有一个双插槽系统,每个插槽都有一个带有两个物理内核的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相同的虚拟页面.
但是,我被告知在现代处理器上,第二种情况不再是一个问题.套接字之间的线程可以有效地写入同一个虚拟页面(只要它们不写入同一个缓存行).
案例二不再是问题吗?如果仍然存在问题,那么正确的术语是什么?将这两种情况称为虚假共享是否正确?
我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验.具体而言,我对试验并行排序算法感兴趣.有没有一个地方我可以找到文档来轻松编辑和构建源代码?
我试过构建各种版本的libstdc ++库,但没有成功.似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件.
我也一直无法找到包含并行排序算法的源文件.我似乎只能找到定义函数的头文件,而不是源代码本身.任何建议或文档链接将不胜感激.
现在我有一个完整的项目,我想在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)
通过并行,您不会这样做,所以通常这将需要更少的资源.
那么现在问题是:
DirtiesContext?Thx提前.
我正在尝试在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++线性代数库文件规定的原因,发展中国家在C++库是一个"通过目前的OpenMP易于并行化的现代C++编译器",但犰狳代码不使用OpenMP的.如何获得与Armadillo并行化的好处?这是通过使用高速LAPACK和BLAS替换之一实现的吗?我的平台是Linux,Intel处理器,但我怀疑这个问题有一个通用的答案.