2012-10-12 4 views
6

확실하지 않습니다. 이것을 가속화하기 위해 4 개의 코어에 대형 memset (예 : 10 MB)을 쓸 수 있습니까?memset을 4 개의 코어에서 병렬 처리 할 수 ​​있습니까?

이러한 램 칩 병렬화가 가능하며 다른 스레드를 실행하는 데 드는 시간 비용은 얼마나됩니까? 밀리 초를 초과합니까?

+5

병렬 처리하면 이러한 작업이 느려질 수 있습니다. 메모리 버스에 액세스하기 위해 여러 개의 코어/CPU가 작동합니다. –

+0

아마도 특정 명령을 사용하여 한 번 더 많은 바이트를 이동하면 도움이 될 것입니다. 사용 매개 변수화는 데이터가 다른 메모리 부분에 분산되어있을 때만 이점이 있습니다. – wbao

+4

병렬 'memset'이 더 빠른 유일한 경우는 각 코어가 프로세서에 연결된 메모리에서 작동하는 NUMA 아키텍처의 매우 큰 메모리 블록을 사용하는 경우입니다. –

답변

2

당신은 올바른 질문을 지적하고 동시에 간단한 대답을하기는 어렵습니다. 몇 가지 측면이 있습니다.

  1. 새 스레드 시작 (또는 일부 캐시에서 선택)의 오버 헤드;
  2. 메모리 버스의 경합.
  3. 위의 사항은 플랫폼마다 다르며 비용이 매우 다릅니다.

큰 PC에는 여러 메모리 버스가 있습니다. 더 작은 것들은 오직 하나만 가지고 있습니다. 하나의 메모리 버스 시스템에서 이것은 의미가 없습니다. 시스템에 여러 메모리 버스 (채널)가있는 경우 데이터 배열에 메모리 뱅크간에 임의의 분할이있을 수 있습니다. 전체 어레이가 동일한 메모리 뱅크에 위치하게되면 병렬화는 쓸모 없게됩니다. 배열의 레이아웃을 파악하는 것은 오버 헤드입니다. 즉, 코어간에 작업을 분할하기 전에 이것이 수행 할 가치가 있는지 없는지 알아 내야합니다.

단순한 대답은 이러한 예측하기 어려운 오버 헤드가 이익을 소비하고 전반적인 결과를 악화시킬 가능성이 높다는 것입니다.

동시에 일부 아키텍처에서는 실제로 매우 큰 메모리 영역이 필요합니다.

+0

* memset *을 parrallizing 할 가치가 있고 실행시 결정할 가치가 있다면 프로그램 시작시 결정할 가치가 있습니까? –

+0

이것은 OS 시작 중에 발생해야합니다. CPU는 시작될 모든 앱에 대해 동일합니다. 반면에 메모리 뱅크 간의 분리는 언제나 다를 것이고 평가하기 쉽지 않을 것입니다. –

+1

최신 CPU에서는 단일 CPU 코어가 0을 쓸 때 모든 메모리 버스를 쉽게 포화시킬 수 있습니다. 그럼에도 병렬화에는 아무런 의미가 없습니다. – MSalters