sketsa forach/doParallel mengatakan (untuk kode yang jauh lebih kecil dari milik Anda):
Perhatikan baik-baik bahwa ini bukan penggunaan praktis doParallel. Ini adalah program “Halo, dunia” kami untuk komputasi paralel. Ini menguji apakah semuanya sudah terinstal dan diatur dengan benar, tapi jangan berharap itu berjalan lebih cepat daripada loop for berurutan, karena itu tidak akan terjadi! sqrt dieksekusi terlalu cepat untuk dieksekusi secara paralel, bahkan dengan jumlah iterasi yang banyak. Dengan tugas yang kecil, biaya tambahan untuk menjadwalkan tugas dan mengembalikan hasilnya bisa lebih besar daripada waktu untuk melaksanakan tugas itu sendiri, sehingga menghasilkan kinerja yang buruk. Selain itu, contoh ini tidak memanfaatkan kemampuan vektor sqrt, yang harus dimiliki untuk mendapatkan performa yang layak. Ini hanyalah ujian dan contoh pedagogi, bukan patokan.
Jadi mungkin karena sifat pengaturan Anda yang tidak lebih cepat.
Sebaliknya cobalah tanpa paralelisasi tetapi menggunakan vektorisasi:
q <- sapply(1:1e6, function(x) 1 + 1 )
Ini melakukan persis sama seperti contoh loop Anda dan dilakukan dalam hitungan detik. Dan sekarang coba ini (itu masih melakukan hal yang persis sama pada waktu yang sama:
x <- rep(1, n=1e6)
r <- x + 1
Ini menambah 1e6 1
s a 1
secara instan. (Kekuatan vektorisasi...)
Kombinasi foreach
dengan doParallel
menurut pengalaman pribadi saya jauh lebih lambat dibandingkan jika Anda menggunakan paket bioinformatika BiocParallel
dari repositori Bioconda. (Saya seorang ahli bioinformatika dan dalam bioinformatika, kita sering kali menghadapi hal-hal yang memerlukan perhitungan yang berat, karena kita memiliki file data tunggal berukuran beberapa gigabyte untuk diproses - dan banyak di antaranya). Saya mencoba fungsi Anda menggunakan BiocParallel
dan menggunakan semua CPU yang ditugaskan sebesar 100% (diuji dengan menjalankan htop
selama eksekusi pekerjaan) semuanya membutuhkan waktu 17 detik.
Yang pasti - dengan contoh ringan Anda, ini berlaku:
biaya tambahan untuk menjadwalkan tugas dan mengembalikan hasilnya bisa lebih besar daripada waktu untuk menjalankan tugas itu sendiri
Bagaimanapun, tampaknya ia menggunakan CPU lebih menyeluruh daripada doParallel
. Jadi gunakan ini, jika Anda memiliki tugas perhitungan yang berat untuk diselesaikan. Berikut kode bagaimana saya melakukannya:
# For bioconductor packages, the best is to install this:
install.packages("BiocManager")
# Then activate the installer
require(BiocManager)
# Now, with the `install()` function in this package, you can install
# conveniently Bioconductor packages like `BiocParallel`
install("BiocParallel")
# then, activate it
require(BiocParallel)
# initiate cores:
bpparam <- bpparam <- SnowParam(workers=4, type="SOCK") # 4 or take more CPUs
# prepare the function you want to parallelize
FUN <- function(x) { 1 + 1 }
# and now you can call the function using `bplapply()`
# the loop parallelizing function in BiocParallel.
s <- bplapply(1:1e6, FUN, BPPARAM=bpparam) # each value of 1:1e6 is given to
# FUN, note you have to pass the SOCK cluster (bpparam) for the
# parallelization
Untuk informasi lebih lanjut, kunjungi sketsa paket BiocParallel. Lihatlah biokonduktor berapa banyak paket yang disediakannya dan semuanya terdokumentasi dengan baik. Saya harap ini membantu Anda untuk urusan komputasi paralel di masa depan.
person
Gwang-Jin Kim
schedule
11.10.2018
future.apply
. Anda mengaturnya menggunakanlibrary(future.apply); plan(multiprocess(workers = 3))
, lalu Anda dapat menjalankan fungsi Anda dengan:future_sapply(X = 1:1e6, FUN = function(x) {1 + 1})
- person bschneidr   schedule 12.10.2018