2011-12-06 4 views
0

병렬 수집을 사용하는 매트릭스 곱셈 알고리즘을 작성하여 곱하기 속도를 높였습니다.Akka -로드 밸런싱 및 프로세서 전체 사용

그것은 그렇게 간다 : 이제

(0 until M1_ROWS).grouped(PARTITION_ROWS).toList.par.map(i => 
    singleThreadedMultiplicationFAST(i.toArray.map(m1(_)), m2) 
).reduce(_++_) 

나는 내가 무슨 짓을, Akka에서 동일한 작업을 수행하고 싶습니다 : 그것은 밝혀졌다

val multiplyer = actorOf[Pool] 
multiplyer start 
val futures = (0 until M1_ROWS).grouped(PARTITION_ROWS).map(i => 
    multiplyer ? MultiplyMatrix(i.toArray.map(m1(_)), m2) 
) 
futures.map(_.get match { case res :Array[Array[Double]] => res }).reduce(_++_) 

class Multiplyer extends akka.actor.Actor{ 
    protected def receive = { 
    case MultiplyMatrix(m1, m2) => self reply singleThreadedMultiplicationFAST (m1,m2) 
    } 
} 
class Pool extends Actor with DefaultActorPool 
    with FixedCapacityStrategy with RoundRobinSelector { 

    def receive = _route 
    def partialFill = false 
    def selectionCount = 1 
    def instance = actorOf[Multiplyer] 
    def limit = 32 // I tried 256 with no effect either 
} 

이이 알고리즘의 행위자 기반 버전 내 i7 sandybridge에서 200 % 만 사용하고 병렬 수집 버전은 프로세서의 600 %를 사용하는 이며 4-5 배 빠릅니다. 나는 발송자 될 줄 알았는데이 시도 :

self.dispatcher = Dispatchers.newThreadBasedDispatcher(self, mailboxCapacity = 100) 

이 (나는 배우 사이를 공유) :

val messageDispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher("d1") 
    .withNewBoundedThrea dPoolWithLinkedBlockingQueueWithUnboundedCapacity(100) 
    .setCorePoolSize(16) 
    .setMaxPoolSize(128) 
    .setKeepAliveTimeInMillis(60000).build 

을하지만 어떤 변화를 관찰하지 않았다. 여전히 200 % 프로세서 사용과 알고리즘은 병렬 수집보다 4-5 배 느립니다. 버전.

나는 내가 그렇게 도와주세요 어리석은 일을하고 있어요 확신합니다! :)

답변

2

이 표현 :

val futures = (0 until M1_ROWS).grouped(PARTITION_ROWS).map(i => 
    multiplyer ? MultiplyMatrix(i.toArray.map(m1(_)), m2) 
) 

게으른 모음을 만들고, 당신의 _.get가 전체 프로그램의 시리얼을 만드는 있도록. 그래서 해결책은 toList 또는 유사 항목을 추가하여 해당 표현식을 엄격하게 만드는 것입니다.