这对我来说似乎很吵.五行开销太多了.
m_Lock.EnterReadLock()
Try
Return m_List.Count
Finally
m_Lock.ExitReadLock()
End Try
Run Code Online (Sandbox Code Playgroud)
那你怎么这么简单呢?
我在我的项目中使用log4net,有一个问题.该程序的主要功能需要很长时间,我使用日志记录来保存有关它的信息.我使用FileAppender将日志保存到文件.
我的应用程序位于共享(本地)文件夹中,可能有多个应用程序实例从一个路径运行.在这种情况下,我只能从第一个程序记录信息,我的应用程序的其他实例无法记录信息,因为日志文件已被锁定.
当我使用"log4net.Appender.FileAppender + MinimalLock"选项时,会出现信息丢失的情况.并非所有来自两个实例的日志都保存到文件中.
如何从并行实例中解决此问题和日志信息?当我使用"MinimalLock"选项时性能下降呢?
谢谢.希望得到你的帮助.
我正在尝试比较并行化选项.具体来说,我正在将标准SNOW和mulitcore实现与使用doSNOWor doMC和foreach.作为一个样本问题,我通过多次计算从标准正态分布中抽取的样本的均值来说明中心极限定理.这是标准代码:
CltSim <- function(nSims=1000, size=100, mu=0, sigma=1){
sapply(1:nSims, function(x){
mean(rnorm(n=size, mean=mu, sd=sigma))
})
}
Run Code Online (Sandbox Code Playgroud)
这是SNOW实施:
library(snow)
cl <- makeCluster(2)
ParCltSim <- function(cluster, nSims=1000, size=100, mu=0, sigma=1){
parSapply(cluster, 1:nSims, function(x){
mean(rnorm(n=size, mean=mu, sd=sigma))
})
}
Run Code Online (Sandbox Code Playgroud)
接下来,doSNOW方法:
library(foreach)
library(doSNOW)
registerDoSNOW(cl)
FECltSim <- function(nSims=1000, size=100, mu=0, sigma=1) {
x <- numeric(nSims)
foreach(i=1:nSims, .combine=cbind) %dopar% {
x[i] <- mean(rnorm(n=size, mean=mu, sd=sigma))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
> system.time(CltSim(nSims=10000, size=100))
user system elapsed …Run Code Online (Sandbox Code Playgroud) 我最近注意到,在System.Collections.Concurrent命名空间中包含的集合对象中,通常会看到Collection.TrySomeAction()而不是Collection.SomeAction().
这是什么原因?我认为它与锁定有关?
所以我想知道在什么条件下尝试(例如)从堆栈,队列,包等中取出项目..失败?
c# collections parallel-processing concurrency multithreading
目前,并行编程有两个主要的硬件环境,一个是多线程CPU,另一个是可以对数据阵列进行并行操作的图形卡.
问题是,鉴于有两种不同的硬件环境,我如何编写一个并行但独立于这两种不同硬件环境的程序.我的意思是我想编写一个程序,无论我有显卡还是多线程CPU或两者兼而有之,系统都应自动选择执行它的方式,显卡和/或多线程CPU中的一个或两个.
是否有允许这样的软件库/语言结构?
我知道有一些方法可以直接定位显卡以运行代码,但我的问题是我们如何在不知道任何硬件知识的情况下编写并行代码,软件系统应该将其安排到显卡或CPU.
如果您要求我对平台/语言更具体,我希望答案是关于C++或Scala或Java.
谢谢
说,我使用MPI运行并行程序.执行命令
mpirun -n 8 -npernode 2 <prg>
Run Code Online (Sandbox Code Playgroud)
总共启动了8个流程.这是每个节点2个进程和总共4个节点.(OpenMPI 1.5).节点包含1个CPU(双核),节点之间的网络互连是InfiniBand.
现在,可以确定等级编号(或过程编号)
int myrank;
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
Run Code Online (Sandbox Code Playgroud)
这将返回0到7之间的数字.
但是,如何确定节点编号(在本例中为0到3之间的数字)和节点内的进程编号(0到1之间的编号)?
我一直在F#做一些计算密集型的工作.功能类似于Array.Parallel.map其使用.NET任务并行库加快了我的代码成倍的真的很最小的努力.
但是,由于内存问题,我重新编写了我的代码的一部分,以便可以在序列表达式中进行延迟评估(这意味着我必须存储并传递较少的信息).到了评价我用的时候:
// processor and memory intensive task, results are not stored
let calculations : seq<Calculation> = seq { ...yield one thing at a time... }
// extract results from calculations for summary data
PSeq.iter someFuncToExtractResults results
Run Code Online (Sandbox Code Playgroud)
代替:
// processor and memory intensive task, storing these results is an unnecessary task
let calculations : Calculation[] = ...do all the things...
// extract results from calculations for summary data
Array.Parallel.map someFuncToExtractResults calculations
Run Code Online (Sandbox Code Playgroud)
当使用任何Array.Parallel函数时,我可以清楚地看到我的计算机上的所有内核都启动(CPU使用率约为100%).但是,所需的额外内存意味着程序永远不会完成.
在运行程序时使用PSeq.iter版本,CPU使用率仅为8%(并且RAM使用率最低).
那么:PSeq版本运行得如此之慢有什么原因吗?是因为懒惰的评价?我错过了一些神奇的"平行"的东西吗?
谢谢,
其他资源,两者的源代码实现(它们似乎在.NET中使用不同的并行库):
https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/array.fs
https://github.com/fsharp/powerpack/blob/master/src/FSharp.PowerPack.Parallel.Seq/pseq.fs …
parallel-processing f# lazy-evaluation seq task-parallel-library
我想在一台机器上(而不是集群)并行化Octave中的for循环.我问了一个关于Octave的并行版本的问题,前一段时间是八度 并行计算
答案建议我下载一个并行计算包,我做了.该软件包似乎主要面向集群计算,但它确实提到了单机并行计算,但还不清楚如何运行并行循环.
我还发现了另外一个关于这个问题的问题,但是我没有找到一个很好的答案来在Octave中并行化循环: 运行与Octave并行的循环部分?
有谁知道我在哪里可以找到在Octave中并行运行for循环的例子???
这里写的是MPI_Cart_shift的输出参数是源和目标进程的等级.但是,在本教程(下面的代码)中,作为源进程返回的内容稍后在MPI_Isend中用于发送消息.任何人都可以清理它 - 实际上"来源"和"目的地"是什么意思?
#include "mpi.h"
#include <stdio.h>
#define SIZE 16
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
int main(argc,argv)
int argc;
char *argv[]; {
int numtasks, rank, source, dest, outbuf, i, tag=1,
inbuf[4]={MPI_PROC_NULL,MPI_PROC_NULL,MPI_PROC_NULL,MPI_PROC_NULL,},
nbrs[4], dims[2]={4,4},
periods[2]={0,0}, reorder=0, coords[2];
MPI_Request reqs[8];
MPI_Status stats[8];
MPI_Comm cartcomm;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
if (numtasks == SIZE) {
MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, reorder, &cartcomm);
MPI_Comm_rank(cartcomm, &rank);
MPI_Cart_coords(cartcomm, rank, 2, coords);
MPI_Cart_shift(cartcomm, 0, 1, &nbrs[UP], &nbrs[DOWN]);
MPI_Cart_shift(cartcomm, 1, 1, …Run Code Online (Sandbox Code Playgroud) 我有一个map操作(实际上是使用parMapfrom 并行运行Control.Parallel.Strategies)需要很长时间.鉴于我知道该函数的应用次数(n在此上下文中),我如何能够轻松地每隔一段时间显示n已评估了多少应用程序?
最明显的解决办法是让地图中的mapM一些putStr映射函数里面,但是这将:
那么,有没有办法跟踪这些我遗漏的信息,避免这些问题?