[완료]멀티코어 멀티스레딩에 관한 문의...
드디어 즐거운 금요일(?)입니다.
여건상 월,화,수,목,금,금,금 이신 분들도 많으실 것으로 생각합니다. ㅎㅎ
각설하고..
멀티스레드와 관련하여 이미지 보정 최적화 작업을 진행중입니다.
하나의 이미지를 각 픽셀별로 보정을 하는 작업인데요, 단순 반복 작업이라
속도를 높이고 싶어 pthread를 사용하고 있습니다.(SMP가 지원되는 커널상에서) Thread 수는 인자로 동적으로 정하도록 하였구요.
그런데 신기한 것이 스레드 수를 늘려도 각 CPU들이 공평하게 작업을 나누어 가져버리더군요.
예를 들어, 10%의 작업량을 먹었다면 두 개의 CPU가 5% : 5%씩 작업을 하더라구요.
프로세스의 우선순위도 조정도 해보고 동적으로(필요할 때마다) 스레드를 생성도 해보고,
미리 스레드를 생성한 후에 데이터를 던져주는 폴링방식으로도 해보았는데 마찬가지네요.
당연히 메모리는 각 스레드마다 따로 할당하였습니다.
공유메모리1 => 스레드1
공유메모리2 => 스레드2
공유메모리는 구조체로 묶여 있습니다.
작업은 단순히 메모리 상의 내용을 덧셈, 곱셈 작업을 진행합니다.
이렇게 공평하게 작업하지 말고, 10% : 10%씩 20%로 늘렸으면 합니다.
경험이 미비하여 멀티스레딩쪽 경험이 있으신분은 조언 및 비평 부탁드리겠습니다.
짐작하기로는 I/O접근성 때문에 이런현상이 일어나는 건 아닌지 걱정되네요.
그리고 이부분이 테스트가 완료되면 OpenMP 쪽도 프로토타이핑을 해볼까 생각중입니다.
그러니까 OpenMP와 관련해서는 패스하는 것이 어떨까요?
그럼 좋은 하루들 되세요.
이렇게 공평하게
<span>이렇게 공평하게 작업하지 말고, 10% : 10%씩 20%로 늘렸으면 합니다.</span>
10:10 <== 이것 역시 공평(?)한 것 아닌가요?
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
단일 쓰레드에서 10%
단일 쓰레드에서 10% 점유율이면 거의 놀고 있는 거 아닌가요?
다른 요인으로 지체되고 있다면 쓰레드를 늘린다고 빨라지진 않을 것 같습니다.
픽셀을 일일이 그래픽 하드웨어에서 받아 작업하신 건 아니시겠죠?
네 파일에서 읽은
네 파일에서 읽은 후에 메모리상에서 작업하고 있습니다.
현재 파일에서 읽을 때, 처음부터 여러 메모리 포인터로 나누어서 읽고 있습니다.
공유메모리 리스크를 최대한 없애보려구, 1/4읽어서 하나의 메모리에 넣고, 또 1/4 읽어서 또다른 메모리에 넣는 방식을 사용하고 있습니다.
저도 지금 그것을
저도 지금 그것을 의심하고 있습니다. 현재 코드상으로는 크게 문제가 없다는 생각이 듭니다.
이미지 처리가 너무 빨리 끝나다 보니, CPU 활용도가 올라가기 전에 처리가 완료되는 것은 아닐까 하는 생각이 들었습니다.
그래서 지금 처리속도가 더 오래걸리는 부분을 같은 구조로 만들어보고 있습니다.
다시 한번 확인 후, 결과 올릴게요.
감사합니다.
그런데 작업하다가
그런데 작업하다가 문득 다시 이런 생각이 드네요.
CPU 사용률을 측정할 때, 보통 CPU 사용률이 단계적으로 올라갑니다. 10-> 30-> .... -> 100
그런데 실제 이렇게 CPU 사용률이 천천히 올라가는건지, 아니면 통계 데이터라서 이렇게 올라가는건지 궁금하네요.
실제 이렇게 사용률이 오른다면, 제가 위에서 가정했던 것이 맞는 것이 되는거죠. ^^;;;;;
만약 통계 데이터라서 천천히 사용률이 오르는 것 처럼 보인다면, 분명 현재 병렬처리를 하고 있는데도
시간단축이 안되는 이유는 무엇인지 궁금하네요. ㅡㅡㅋ
그럼 좀더 작업을 진행하고 경과 사항 다시 한번 올리겠습니다. 수고들 하세요.
해결 완료
해결 완료 되었습니다.
정말 문제는 어이없는 곳에서 발생하였습니다. 작성한 코드 문제 없었습니다. 잘 동작하였습니다.
문제는 시간측정함수 => clock()이 문제였습니다.
clock()함수는 프로세스에서 사용한 총 clock 타임을 반환하는 듯 합니다. 1개가 10초를 사용하나, 4개가 2.5초 씩 사용하나 결국 사용시간은 10초가 되어 버리는 겁니다.
ㅡㅡ; 이것으로 2~3일 버린 것 같네요.
clock()함수 대신에 clock_gettime()를 사용하니 시간이 잘 나오네요.
실제 스탑와치로 시간을 측정하니 분명히 처리시간은 줄어드는데, 출력은 그대로인겁니다.
이 부분은 윈도우에서도 동일하게 발생할 수 있는 문제입니다.
(윈도우에서 테스트 해보았는데, 특정 함수들은 아예 시간이 안나오는 경우도 있네요. 시스템 및 하드웨어에 따라 틀릴 수도 있으니 직접 해보셔야 할 듯 합니다.)
혹시 듀얼 또는 멀티코어에서 같은 문제가 있으신 분들은 시간측정 함수를 잘 선정하시기를 바랍니다.
그럼 좋은 하루들 되세요.
댓글 달기