我是 R 的初學者。我有一個任務,我需要做一個類似于 for 回圈的任務,但是對于大量的觀察,在這種情況下是 500k 次。
for (number in 1:500000){
sqrt(number)}
問題是我需要對很多主題進行回圈。所以整個腳本看起來像這樣:
for (subject in 1:400){
for (number in 1:500000){
sqrt(number)}
}
我想在我的多個內核 (16) 上并行化這個程序。我發現在大多數教程中他們做這樣的事情:
library(foreach)
library(doParallel)
registerDoParallel(16)
然后他們繼續使用以下方法簡單地更改語法:
foreach (subject=1:400) %dopar% {
for (number in 1:500000){
sqrt(number)}
}
對我來說,將所有這些一起使用意味著我將在我的一個處理器上執行每個范圍為 1:500000 的 for 回圈。所以這意味著,如果我在 1:500000 回圈中的一次迭代的時間復雜度為一小時,那么我將在一小時內進行 16 次迭代,因為我的每個處理器都將并行進行一次迭代。
在實踐中,我通過跟蹤經過時間的時間來檢查,似乎我的并行程序實際上比順序程序慢得多。我做錯了什么?有沒有一種簡單的方法(初學者友好)告訴我的機器在我機器的一個核心上并行執行每 1:500000 次迭代?
uj5u.com熱心網友回復:
您沒有做錯任何事情,只是您正在運行的操作沒有花費足夠的時間來使并行執行變得經濟。這是foreach 小插圖的一個片段:
并行運行許多小任務通常比順序運行它們需要更多的時間來執行,如果它已經運行得很快,無論如何也沒有動力讓它運行得更快。但是如果我們并行執行的操作需要一分鐘或更長時間,就會開始有一些動力。
如果我們sqrt不是運行500,000 次,而是運行50,000,000 次,您就會看到并行執行的好處。
library(tictoc)
library(foreach)
library(doParallel)
registerDoParallel(16)
tic("no_parallel")
for (subject in 1:400){
for (number in 1:50000000){
sqrt(number)}
}
toc()
#> no_parallel: 271.312 sec elapsed
tic("parallel")
foreach (subject=1:400) %dopar% {
for (number in 1:50000000){
sqrt(number)}
}
toc()
#> parallel: 65.654 sec elapsed
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368514.html
下一篇:洗掉兩行都有非零數字的列?
