0

일반 매트릭스의 구현이 있으며 병렬 처리 및 직렬 처리에서 '*'및 '+'연산자를 사용하려면 옵션을 만듭니다.병렬 처리 대 직렬 처리

병렬 계산 예 : 우리는 m1과 m2 행렬을 가지고 있고 m3 = m1 * m2이라고 가정합니다. 다른 스레드로 m3 행 i '을 계산합니다. 플러스 :

직렬 계산 단지 m3 [0,0] 계산 m3 [0,1] 등등

I는 크고 작은 매트릭스 에 사용하는 각 동작 시간을 측정하고, I는 주목보다

작은 행렬에서는 직렬 처리가 병렬 처리보다 빠르지 만 다른 한편으로는 병렬 처리가 큰 행렬에서 더 우수한 성능을 보였습니다.

The results: 
+----------------------------+--------------------------------+------------+ 
|    Big   |    Small    |   | 
+----------------------------+--------------------------------+------------+ 
|  *  |  +  |  *  |  +  |   | 
+-------------+--------------+---------------+----------------+------------+ 
| 0.697798sec | 0.0407585sec | 8.7408e-05sec | 0.000109052sec | Parallel | 
+-------------+--------------+---------------+----------------+------------+ 
| 11.9984sec | 0.0235058sec | 6.68e-07sec | 7.76e-07sec | Serial | 
+-------------+--------------+---------------+----------------+------------+ 

누군가가 이유를 설명해 주시겠습니까?

고마워요!

+4

CPU 캐시는 선형 메모리 액세스에 최적화되어 있습니다. L1, L2 및 L3 캐시 성능을 보여줄 도구를 얻으십시오. –

+0

스레드를 돌리는 데는 시간이 걸립니다. – NathanOliver

+0

또한 크고 작은 의미없는 용어는 우리가 10과 100을 복용하고 있습니까? 그리고 각각의 크기에 대해 얼마나 많은 쓰레드를 가지고 있고 쓰레드 풀을 사용하고 있거나 각 쓰레드를위한 새로운 쓰레드를 시작 했습니까? –

답변

0

예를 들어 작은 크기의 매트릭스에서 크기가 10 * 10 인 행렬을 사용하면 프로그램을 작은 조각으로 나눌 필요가 없기 때문에 직렬 처리가 유리합니다. 처리. 이 동일한 10 * 10 매트릭스가 병렬 처리를 통해 작동 될 때, 작은 조각으로 분해되어 각각의 개별 프로세서에 공급됩니다 (이 모든 것이 매트릭스를 깨뜨리고 각각의 병렬 프로세서는 시간을 필요로 함) 따라서 병렬 처리의 성능은 작은 행렬보다 감소합니다.

크기가 큰 매트릭스, 예를 들어 100 * 100 크기의 매트릭스가 직렬 프로세서로 넘겨지면 프로세서는이 단일 프로그램을 처리 할 수 ​​없지만 모든 인터럽트를 처리해야합니다. 따라서 대기 시간이 증가합니다. 그러나 동일한 100 * 1000 매트릭스가 병렬 처리로 넘겨지면 합리적으로 작은 조각으로 분해되어 하나 이상의 프로세서에 의해 작동됩니다. CPU가 2 개의 코어/프로세서를 포함하는 경우 예를 들어이 매트릭스와 다른 모든 인터럽트 처리 및 기타 프로그램에 대해 하나의 전용 버스를 할당 할 수 있으므로 대기 시간이 크게 감소합니다.

0

다중 스레드 또는 작업.


관계없이 OS가 아닌지 여부가 오버 헤드는 병렬 프로그래밍 오버 헤드를 갖는다. 최소한, 다른 프로세서 (코어)는 스레드 코어를 실행하도록 설정되어야합니다. 이것은 실행 시간이 걸립니다.

또 다른 항목은 동기화 대기 시간입니다. 어떤 시점에서 주 프로세서는 다른 프로세서가 완료 될 때까지 기다려야합니다.

또한 신호 또는 통신과 관련된 오버 헤드가 있습니다. 보조 프로세서는 계산이 완료되었음을 주 프로세서에 알리기 위해 실행 시간을 가져야하며 결과를 어딘가에 저장해야합니다.

스레드의 오버 헤드가 스레드의 실행 시간보다 길면 (예 : 간단한 단일 곱셈) 병렬 처리로 인해 시간이 절약되지 않을 수 있습니다.

작업량
스레드에 의해 수행되는 작업량이 중요합니다. 10x10 매트릭스는 오버 헤드 비용을 극복하기에 충분한 작업이 없을 수 있습니다. 스레드를 생성 할 때 생성 및 모니터링의 오버 헤드를 정당화하기 위해 더 많은 작업을 수행해야합니다. 운영체제가있는 경우

위임
는 OS는 쓰레드가 실행되는 방법을 담당하고있다. 시스템에 프로세서가 여러 개있는 경우에도 하나의 프로세서에서 라운드 로빈 스타일로 실행할 수 있습니다. (OS는 프로세서 당 하나의 작업이나 애플리케이션을 위임 할 수 있습니다.) OS가 단일 코어에서 스레드를 공유 할 때 성능이 크게 향상되지 않습니다. 스레드 코드를 다른 코어에 위임 할 수 있는지 OS를 조사하고 싶을 수 있습니다.

메모리 충돌
대부분의 멀티 프로세서 플랫폼은 메모리를 공유합니다. 하드웨어에는 프로세서와 메모리간에 하나의 데이터 버스 만있을 수 있습니다. 따라서 한 프로세서는 다른 프로세서가 메모리에 액세스하는 동안 대기해야합니다 (한 번에 하나의 프로세서 만 데이터 버스를 사용할 수 있기 때문에). 이로 인해 프로그램의 효율성이 저하되어 실적 결과를 무시할 수 있습니다.

데이터 캐시와 명령어 파이프 라인
프로그램은 상당한 성능 향상을 생산하지 않습니다 여러 스레드를 생성, 데이터 캐시에 최적화되지 않습니다. 프로세서는 메모리에서 캐시를 다시로드해야하므로 (특히 opter 프로세서가 데이터 버스를 사용하여 끝날 때까지 기다릴 때) 시간을 낭비 할 수 있습니다. 데이터 캐시 구조를 중심으로 데이터 및 데이터 처리를 설계함으로써 단일 실행 스레드에서 더 많은 개선점을 보여줄 수 있습니다.

프로세서에는 명령을위한 캐시 또는 파이프 라인이있을 수도 있습니다. 프로그램 실행에서의 전송은 프로세서를 귀찮게합니다. 코드가 캐시에 있는지 또는 코드를 가져 와서 가져올지를 시간 낭비해야합니다. 실행 전송 횟수를 줄이면 프로그램 속도가 빨라지 며 일반적으로 스레드를 만드는 것보다 효과적입니다.

특히 플랫폼이 실행되는 동안 플랫폼이 다른 응용 프로그램을 실행하는 경우 다양한 요인으로 인해 결과가 중요하지 않을 수 있습니다. 벤치마킹 기술에 대해 공부하십시오. 많은 양의 데이터를 보유하거나 프로그램을 상당 기간 (또는 둘 다) 실행해야 할 수도 있습니다. 일반적으로 벤치 마크 영역에서 1E09 반복이 중요합니다 (많은 컴퓨터가 1E-8 초 정도의 지침을 실행할 수 있으므로 좋은 평균을 얻기 위해서는 여러 번 실행해야합니다).