2016-07-02 2 views
3

나는 Chudnovsky 수식에서 Pi를 계산하는 프로그램을 가지고 있습니다. 그것은 Java로 작성되었으며 요소의 색인을 포함하는 계승 (factorials)과 지수 (power)와 같은 중간 계산을 저장하는 데 사용되는 공유 벡터 (shared Vector)를 사용합니다.공유 메모리를 사용할 때 프로그램 속도가 빨라짐

그러나 동기화 된 벡터 (기본적으로 스레드 안전)이므로 하나의 스레드 만 읽고 쓸 수 있다고 생각합니다. 그래서 우리는 속도가 증가하는 대신에 많은 쓰레드가있을 때 계산 시간이 일정 해지는 것을 보았습니다.

내가이를 피할 수있는 방법이 있습니까? 동일한 공유 메모리에 너무 많은 스레드 읽기/쓰기가있을 때 수행 할 작업은 무엇입니까?

답변

1

액세스 패턴이 많은 읽기 및 임시 쓰기 인 경우 비 동기화 된 데이터 구조를 ReentrantReadWriteLock으로 보호 할 수 있습니다. 그것은 여러 개의 독자를 허용하지만 단 하나의 작가 만 허용합니다.

구현에 따라 ConcurrentHashMap을 사용해도 도움이 될 수 있습니다.

당신

약간의 속임수와 사용할 수 있습니다 어느 쪽 AtomicIntegerArray 또는 Futures/CompletionStagesAtomicReferenceArray.

+0

HashMap은 정말 좋은 생각이었습니다. 나는 그것이 이미 잊어 버렸습니다. 내 계산 된 물건 대부분을 저장하는 명백한 완벽한 선택이었습니다. – Mackiavelli

1

각 스레드의 결과를 스택에 저장하십시오. 하나의 스레드는 모든 스레드에서 결과를 수집하여 함께 합칩니다. 물론 스택이 비어서는 안됩니다.

팩토리얼에서 여러 스레드를 작동 시키려면 팩토리얼 결과 목록을 생성하는 스레드 또는 두 개를 생성하지 않는 것이 좋습니다. 필요한 경우 다른 스레드에서 결과를 찾을 수 있습니다.

+0

이 좋은 대답입니다 만 이것은 내 문제를 완전히 해결하지 못합니다. Wikipedia에서 볼 수 있듯이 Chudnovsky 수식에는 계승이 있습니다. 따라서 모든 스레드는 그 계승을 계산하는 공유 메모리/벡터에 접근 할 수 있어야합니다. 한 스레드가 큰 계승을 계산할 때, 다른 계승은 계승을 계승하는 등의 접근을 필요로합니다. – Mackiavelli

+0

내 게시물이 확장되었습니다. – Shiro

+0

계승 결과 목록을 만드는 것이 무엇을 의미합니까? 다른 스레드는 수식의 요소 계산을위한 계승에 따라 달라집니다.게다가 factorials가 수식의 요소보다 빠르게 계산되도록 보장 할 수있는 방법이 없습니다. – Mackiavelli

0

동일한 공유 메모리를 갖는 대신 스택에 개별 메모리가있는 다중 스레드를 가질 수 있습니다. 결국,이 모든 것들을 하나의 스레드와 함께 (또는 때때로) 추가하십시오!

+0

다른 사람들의 답변을 복사하지 마십시오. – Shiro

+0

아, 그냥 눈치. 나는 당신이 방금 그것을 게시했다는 것을 짐작하고 나는 체크를 귀찮게하지 않았다. – Michael

+0

오, 케이, 그냥 복사 & 붙여 넣기하고 말씨를 바꾼 줄 알았는데. – Shiro

0

높은 처리량이 필요한 경우 Disruptor 및 RingBuffer를 사용할 수 있습니다.

조잡한 수준에서는 생성자가 개체를 놓은 큐의 멀티 캐스트 그래프로 Disruptor를 생각할 수 있습니다.이 개체는 별도의 다운 스트림 큐를 통해 병렬 소비를 위해 모든 소비자에게 보내집니다. 내부를 들여다 보면이 대기열 네트워크가 실제로 단일 데이터 구조 인 링 버퍼임을 알 수 있습니다.

각 생산자와 소비자는 현재 작업중인 버퍼의 슬롯을 나타내는 시퀀스 카운터를 가지고 있습니다. 각 생산자/소비자가 자신의 시퀀스 카운터를 기록하지만 다른 사람의 순서를 읽을 수있는 것은

몇몇 유용한 링크 카운터 :

https://lmax-exchange.github.io/disruptor

http://martinfowler.com/articles/lmax.html

https://softwareengineering.stackexchange.com/questions/244826/can-someone-explain-in-simple-terms-what-is-the-disruptor-pattern

관련 문제