2016-04-21 9 views
5

:Haskell parMap performansı? Ben çok basit bir örnekle haritası vs tezgah parMap çalışıyordu

import Control.Parallel.Strategies 
import Criterion.Main 

sq x = x^2 

a = whnf sum $ map sq [1..1000000] 
b = whnf sum $ parMap rseq sq [1..1000000] 

main = defaultMain [ 
    bench "1" a, 
    bench "2" b 
    ] 

Benim sonuçları parMap dan sıfır hıza gösterir gibi görünmektedir ve bu olabilir neden merak ediyorum?

benchmarking 1 
Warning: Couldn't open /dev/urandom 
Warning: using system clock for seed instead (quality will be lower) 
time     177.7 ms (165.5 ms .. 186.1 ms) 
        0.997 R² (0.992 R² .. 1.000 R²) 
mean     185.1 ms (179.9 ms .. 194.1 ms) 
std dev    8.265 ms (602.3 us .. 10.57 ms) 
variance introduced by outliers: 14% (moderately inflated) 

benchmarking 2 
time     182.7 ms (165.4 ms .. 199.5 ms) 
        0.993 R² (0.976 R² .. 1.000 R²) 
mean     189.4 ms (181.1 ms .. 195.3 ms) 
std dev    8.242 ms (5.896 ms .. 10.16 ms) 
variance introduced by outliers: 14% (moderately inflated) 
+0

Kare neredeyse hiçbir işe yaramıyor. Paralel olarak yapmaya çalışmaktan gerçekten hiçbir şey elde edemezsiniz. – Cubic

+0

@Cubic Listenin parçalarını farklı konulara ayırması gerektiği izlenimi altındaydım, bu yüzden her iplik için etkin bir şekilde daha az operasyon olacaktı. – allidoiswin

cevap

7

sorun parMap her bir liste elemanı için bir paralel hesaplama kıvılcım olmasıdır. Listeniz, yorumlarınızdan düşündüğünüz gibi değil, parListChunk stratejisinin kullanılmasını gerektiriyor.

Dolayısıyla, parMap yüksek yüklere sahiptir, bu nedenle her kıvılcımın tek bir rakam karesi olması, maliyetinin bu yükün üstesinden geldiği anlamına gelir.

+3

Squaring o kadar ucuz ki, parListChunk'de bölme listesi paralel kazançları da altüst ediyor. –

+3

Artı Paralellizasyon, aksi takdirde büyüklük hızlanma emri veren füzyonu öldürür. –

+0

@ AndrásKovács: Gerçekten de. [Ben bir programa paralel olarak] (https://github.com/sacundim/tau-sigma/pull/18) (“parBuffer” kullanarak) ne zaman yaptığımı kesin olarak gözlemledim. Program, giriş verileri üzerinde istatistiksel işlevlerin bir ailesini hesaplar ve bazıları diğerlerinden daha pahalıdır. Bu yüzden hızlı olanları, yavaş olanları çok daha hızlı yapma maliyetiyle biraz daha yavaşlattı. Minimum çaba ile. –

İlgili konular