我试图运行一个函数,函数中有一个随机数生成器.结果与我的预期不符,所以我做了以下测试:
# Case 1
set.seed(100)
A1 = matrix(NA,20,10)
for (i in 1:10) {
A1[,i] = sample(1:100,20)
}
# Case 2
set.seed(100)
A2 = sapply(seq_len(10),function(x) sample(1:100,20))
# Case 3
require(parallel)
set.seed(100)
cl <- makeCluster(detectCores() - 1)
A3 = parSapply(cl,seq_len(10), function(x) sample(1:100,20))
stopCluster(cl)
# Check: Case 1 result equals Case 2 result
identical(A1,A2)
# [1] TRUE
# Check: Case 1 result does NOT equal to Case 3 result
identical(A1,A3)
# [1] FALSE
# Check2: Would like to check if it's a matter …Run Code Online (Sandbox Code Playgroud) 我在C语言编程时学习了一些关于pthreads和性能的知识,我想知道最好的方法是int在数组中添加一个单独的元素(相当大的一个,大约有5000个元素)以及将a乘以int数组中的所有元素的最佳方法.
我尝试并行执行此操作,但没有太大改进.我的并行方法是传递struct包含add/multiply的值以及指向数组的指针.我将此作为论据传递给了pthread_create.在被调用的函数中,我将给定值添加/乘以数组中的所有元素.
我觉得有一种更好的方法可以将数字乘以或添加到数组中的所有5000个元素(或更多).我也听说过那些SIMD命令.这可能有助于这种情况吗?
在Haskell中,如何print并行运行多个(monad?)函数(例如)并按照完成时间的顺序查看它们的输出?我想要三个进程,每个进程最终都在打印函数中.
import Control.Parallel
main = a `par` b `pseq` (a,b)
where
a = print("ack",ack 3 10)
b = print("fac",fac 42)
Run Code Online (Sandbox Code Playgroud)
如果我不使用pseq,它将显示par组合指定的最后一个.我想确保在程序结束之前完成所有进程.我试过这个,但它没有显示a,b的输出:
...
main = a `par` b `pseq` print("done.")
...
Run Code Online (Sandbox Code Playgroud)
注意:我的程序以以下行结束:
fac 0 = 1
fac n = n * fac (n-1)
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
Run Code Online (Sandbox Code Playgroud) package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func alphabets() {
for char := 'a'; char < 'a'+26; char++ {
fmt.Printf("%c ", char)
}
wg.Done() //decrement number of goroutines to wait for
}
func numbers() {
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
}
wg.Done()
}
func main() {
runtime.GOMAXPROCS(2)
wg.Add(2) //wait for two goroutines
fmt.Println("Starting Go Routines")
go alphabets()
go numbers()
fmt.Println("\nWaiting To Finish")
wg.Wait() //wait for the two goroutines to …Run Code Online (Sandbox Code Playgroud) 我试图掌握Python中的多处理.我从创建此代码开始.它只是计算整数i的cos(i),并测量一个人使用多处理时和一个人不使用时的时间.我没有观察到任何时差.这是我的代码:
import multiprocessing
from multiprocessing import Pool
import numpy as np
import time
def tester(num):
return np.cos(num)
if __name__ == '__main__':
starttime1 = time.time()
pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=pool_size,
)
pool_outputs = pool.map(tester, range(5000000))
pool.close()
pool.join()
endtime1 = time.time()
timetaken = endtime1 - starttime1
starttime2 = time.time()
for i in range(5000000):
tester(i)
endtime2 = time.time()
timetaken2 = timetaken = endtime2 - starttime2
print( 'The time taken with multiple processes:', timetaken)
print( 'The time taken the usual way:', timetaken2)
Run Code Online (Sandbox Code Playgroud)
我观察到两次测量之间没有(或非常小的)差异.我正在使用8芯机器,所以这是令人惊讶的.我在代码中做错了什么? …
python parallel-processing ipython multiprocessing python-3.x
我是MATLAB的新手,我只是尝试执行一个并行的小程序,但问题是并行执行需要比串行执行更多的时间?
close all
clear all
clc
a= rand(1e6,1);
b= rand(1e6,1);
c= zeros(size(a));
d= ones(size(c));
e= zeros(size(d));
tic
tstart=tic;
for i=1:length(a)
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
end
t_normal_for=toc(tstart)
tstart=tic;
parfor i=1:length(a)
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
end
t_parfor=toc(tstart)
***************************************
t_normal_for =
0.3860
t_parfor =
2.8403
Run Code Online (Sandbox Code Playgroud)
谁能帮忙!事实上,我的计算机中有4名工人,MATLAB的版本是R2014a.请问另一个问题,我可以向计算机中的每个工作人员发送相同的功能吗?
提前谢谢Ammar
下面的代码片段是否会results针对迭代范围的所有索引正确写入?
虽然有多个线程同时访问同一个对象; 由于索引,每个线程都在写入内存中的唯一位置.
let results:NewType[] = Array.zeroCreate temp.Length
let mutable data = Unchecked.defaultof<OldType>
let loopResult =
System.Threading.Tasks.Parallel.For(
0,
temp.Length,
(fun i ->
data <- temp.[i]
results.[i] <- NewType(data.X, data.Y)
)
)
Run Code Online (Sandbox Code Playgroud) 我试图在R上运行并行kNN程序,但我收到此错误:
{:任务1失败 - "无法找到功能"knn""出错
这是该计划:
library(class)
library(doSNOW)
library(foreach)
train <- read.csv('train.csv')
test <- read.csv('test.csv')
trainY <- read.csv('trainY.csv')
cl <- as.vector(as.matrix(trainY))
system.time(summary(knn(train, test, cl, k=25, prob = TRUE)))
clus <- makeCluster(4)
registerDoSNOW(clus)
countrows=nrow(test)
system.time(foreach( icount(countrows) ) %dopar% {
summary(knn(train, test, cl, k=25, prob = TRUE))
})
stopCluster(clus)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用英特尔TBB parallel_reduce来获取由双精度组成的数组元素的总和.但是,与OpenMP减少实现相比,结果是不同的.
这是OpenMP的一个:
double dAverageTemp = 0.0;
#pragma omp parallel for reduction(+:dAverageTemp)
for (int i = 0; i < sCartesianSize; i++)
dAverageTemp += pdTempCurr[i];
Run Code Online (Sandbox Code Playgroud)
此代码返回正确的值"317.277 493 "; 但是这个TBB代码:
double dAverageTemp = tbb::parallel_reduce(tbb::blocked_range<double*>(pdTempCurr, pdTempCurr + sCartesianSize - 1),
0.0,
[](const tbb::blocked_range<double*> &r, double value) -> double {
return std::accumulate(r.begin(), r.end(), value);
},
std::plus<double>()
);
Run Code Online (Sandbox Code Playgroud)
坚持认为结果是"317.277 193 ".
我在这里错过了什么?
我刚刚在超级计算机上安装了OpenMDAOv1.3.安装成功,所有测试都通过或跳过.但是,当我运行测试时,我得到以下警告:
*path/OpenMDAO/openmdao/core/driver.py:228: UserWarning: parallel derivs %s specified but not running under MPI
warnings.warn("parallel derivs %s specified but not running under MPI")
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么做(如果有的话),所以我正在寻找有关警告信息含义的信息.我们计划与OpenMDAO的内置MPI功能并行运行.我目前在系统上加载了openmpi-1.8.4.