프로그램을 짜다보니 펜4의 하이퍼스레딩이 이상하네요.

strawberryit의 이미지

안녕하세요 KLDP엔 자주 오는데 처음으로 글 써보네요.

다름이 아니라 제가 숙제로 행렬 1000 by 1000짜리를 곱하는 프로그램을 작성했는데요

1. 걍 곱셈
2. 반씩 나누어서 각각 프로세스 만들어서 실행

이런건데요. 이론적으로는 2번이 시간이 절반이 되어야 하잖아요.

그래서 몇가지 실험을 해봤어요.

실행 환경은 모두 우분투 8.10 입니다. 시간은 여러번 반복해서 나온 평균치입니다.

프로세스 1개사용시 2개 사용시
1. AMD Athlon X2 3800+ (@2.0Ghz) : 28s 14s
2. Intel Pentium 4 3.0Ghz(with 하이퍼스레딩) : 22s 19s
3. Intel Pentium 4 3.0Ghz(without 하이퍼스레딩) : 22s 11s

실험결과 CPU연산은 클럭빨이라는걸 알았는데요(ㅎㅎ).

근데 이상한 점이 하이퍼스레딩을 사용하면 프로세스 2개 사용시 시간이 더 걸리네요.

왠지 2번하고 3번하고 뒤바뀐거같은데...시스템모니터에서 코어 개수는 확인했거든요.

혹시 시간이 남아서 결과값을 내는데 도와주실 분이 계시다면 첨부파일을 올렸으니 한번 확인해주세요.
소스는 과제를 아직 제출안해서 쫌.... 그냥 단순히 자식 프로세스 만들어서 부모자식이 사이좋게(?) 곱셈계산하는 프로그램입니다.

File attachments: 
첨부파일 크기
Binary Data matrix.tar.gz3.09 MB
inhosens의 이미지

그게 맞는 것 같은데요.
하이퍼스레딩이라는게 멀티코어를 사용하는 것이 아니라 개별 코어에서 스레드를 효율적으로 관리하는 기술이라
하이퍼스레딩을 사용하는 경우에 2개의 코어를 다 사용하는 것과 다른 결과가 나타날 수 있겠죠.

kkb110의 이미지

저도 빠삭하게 아는 것은 아니지만 결과는 이해가 갈 것 같은데요.

예를들어 스레드 1,2가 있고 하나는 정수연산만, 하나는 부동소수점 연산만 한다면

CPU에서 사용하는 파트가 다름으로 하이퍼스레딩 병렬화 효과가 나겠지만

하지만 위와같은 프로그램, 두 스레드가 정확히 같은 일을 하는 상황이라면

하이퍼스레딩 할 건덕지가 없을 수 있겠죠. 거기다가 하이퍼스레딩 오버헤드+@ 해서 더 나빠진 것 같은데요.

terzeron의 이미지

하이퍼쓰레딩은 1개 코어(CPU)를 두 개의 쓰레드가 동시에 실행될 수 있도록 가상적으로 코어가 두 개인 것처럼 지원해주는 기능을 말합니다. 그러니 실제로 코어가 두 개인 것과는 성능 차이가 날 수 밖에 없습니다.

strawberryit의 이미지

답변 감사합니다.
그런데 제가 궁금한 점은 듀얼코어나 하이퍼스레드를 OFF한 싱글코어가 두개의 프로세스를 사용할 때 둘 다 시간이 단축되었다는 점인데요.
이론적으로는 싱글코어가 더 오래 걸려야 하지 않나요? 혹시 작업이 덜 빡세서 그런가-_-
집에가서 프로세스를 한 10개정도 만들어서 돌려봐야 겠네요.

우분투~ へ( ̄∇ ̄へ) 우분투~ (っ ̄∇ ̄)っ 우분투~

inhosens의 이미지

다시 보니까 1,2번은 reasonable한데 3번이 매우 이상하네요.

dhunter의 이미지

HT를 켰는데 이러한 메모리-CPU연산 의존적인 작업을 하다보면, 쓸데없는 컨텍스트 스위칭이나, 하이퍼스레딩을 위한 별도의 연산이라던가가 발생하여 연산이 더 걸리는것도 능히 발생 할 수 있는 케이스같은데요.;

아니면 두 코어에서 독자적으로 돌아가는게 아니라, 컨텍스트 스위칭을 몇번 하다가 운이 나쁘게 한 코어로 몰리는 상황도 발생 할 수 있고요.
--
from bzImage
It's blue paper

from bzImage
It's blue paper

ironiris의 이미지

프로그램을 동시에 2개 실행하면 속도차이가 날것 같습니다.

codebank의 이미지

궁금한게 멀티 쓰레드인지 멀티 프로세서인지...
멀티 프로세서로 작성했다면 CPU지정도 가능하게 프로그램하신건지...

멀티 쓰레드라면 그냥 CPU가 몇개이든 상관없지 않나요? (한개의 CPU에서 다 처리해버리는게
아닌가요???)
그리고 멀티 프로세서또한 비슷하게 동작할 거라고 생각하는데...

멀티 프로세서도 뭔가 지정해야 여러개의 CPU를 사용한다고 알고 있는데 제가 잘못알고 있었나요?
------------------------------
좋은 하루 되세요.

------------------------------
좋은 하루 되세요.

prio의 이미지

소스를 봐야 알수 있는 문제라서 순전히 소설일 수도 있는 답변입니다만...

1000x1000 dense matrix 곱셈이 20초 정도 걸리는 것으로 보아 캐시 최적화를 하지 않으신 것 같습니다.
간단한 삼중 루프로 구현하셨다고 추측되는데, 그러면 성능은 대개 캐시에 의해 결정됩니다.
sizeof(int) * 1000 * 1000 ~= 4MB, Intel P4의 L2 cache = 512KB

이 때 두 개의 프로세스로 나눌 경우 각 프로세스가 전체에 비해 좀 더 작은 범위의 메모리를 접근하게 되므로
캐시 미스가 줄어들어 싱글 코어에서도 성능이 더 좋아질 수 있습니다.
(맞는지 확인을 위해서는 두 개로 나눈 작업을 하나의 스레드에서 그냥 순차적으로 실행해 보시면 되겠습니다.)
대신 하이퍼 스레딩으로 돌리는 경우 스레드 간의 cache pollution에 의해 그 이득을 덜 보게 되는 것으로 생각됩니다.

JuEUS-U의 이미지

하이퍼쓰레드는 하이퍼쓰레입니다 = _=);;; (load만 늘이는...)

일단 하이퍼쓰레드를 적용했다 하더라도, 성능이 향상되는 부분은 연산 뿐입니다.
메모리 관리는 별다른 변화가 없습니다.
따라서 (CPU)Cache에 최적화 시키지 않으면 성능이 늘어날 리가 없는거죠...

그리고 L1-L2 상에서의 충돌로 캐시가 꼬이고,
권한이 없어도 다른 프로세스의 메모리가 접근 가능한 문제가 있었죠...

strawberryit의 이미지

답변 감사합니다.

하이퍼스레딩이 생각보다 별로군요.(듣기론 성능 향상이 아니라 펜4에서 못써먹던 성능 도로 찾아먹는거라던데...-_-)

곱셈은 걍 삼중루프를 써서 계산했죠.이거도 책보고 겨우겨우 했는데-_-;;;

프로세스의 CPU지정은 걍 리눅스의 프로세스 관리실력에 맞겼구요ㅎㅎ

단순히 CPU 클럭만 보고 따지는게 아니라 캐시도 따져보고 해야 하는군요. 잘 배웠습니다.

덤으로 프로그램 4개를 병렬로 실행해 봤는데요. (시간이 없어서 제대로 실험하지는 않았어요)

AMD 3800 은 그대로
펜4 HT는 36초 18초
펜4 HT off도 그대로

좀더 배워서 나중에 다시한번 실험해 봐야 겠네요.

우분투~ へ( ̄∇ ̄へ) 우분투~ (っ ̄∇ ̄)っ 우분투~

블루스크린의 이미지

"
1. 걍 곱셈
2. 반씩 나누어서 각각 프로세스 만들어서 실행

이런건데요. 이론적으로는 2번이 시간이 절반이 되어야 하잖아요.
"
싱글 CPU 싱글스래드면
이론적으로 2번이 1번과 거의 시간이 비슷해야 하지 않나요?

싱글 CPU 싱글스래드 결과가 이해가 안되네요
제가 strawberryit님이 올리신 파일을 싱글 CPU 싱글스래드 실행했을때도

./main
0. Initializing Matrix...Done.
1. Calculating matrix product (One process)...Done.
2. Using 2 Process...
Child process start...Done.
Parent process start...Done.

Result :
Sum : 250652510499943
Average : 250652510.499943
Variance : 49082075516034.567089
Using 1 process : 47.420s
Using 2 process : 24.140s
23.280s saved.
Saving calculated matrix...
Saving calculated matrix2...
End...

와 같이 결과가 나오는데 이해가 안됩니다
소스가 없어서 분석해보지는 못했구요
top으로 봤을때 CPU 부하는 1 process 시 100% , 2 process 시 50%씩 2개 였습니다

이해가 안되네요.....

-------------------------------------------------------------------------------
이 댓글(comment)의 수정 및 삭제를 위해 이 글에 답글(reply)을 쓰지 말아 주십시요.
의견이 있으시면 원 글에 댓글(comment)로 써 주세요.

-------------------------------------------------------------------------------
이 댓글(comment)의 수정 및 삭제를 위해 이 글에 답글(reply)을 쓰지 말아 주십시요.
의견이 있으시면 원 글에 댓글(comment)로 써 주세요.