동일 작업 쓰레드 & 병렬 작업시 퍼포먼스
글쓴이: max77 / 작성시간: 목, 2012/05/31 - 10:24오전
안녕하세요
프로그램에 연산하는 함수가 하나 있는데
프로그램에서 이 함수를 50만번 ~ 100만번 이상 호출하게 됩니다. 서로 다른 인자값을 넘겨주게 되구요.
이 함수를 단순 프로세스로 돌리는 것과
thread화 시키는 것과 , openmp를 이용하여 작업을 분할하여 병렬처리 하는것에서
가장 시간을 단축할 수 있는건 병렬처리 일까요??
병렬처리로 여러 처리를 하는 프로그램에서 사용해 본 적은 있는데 위처럼 동일한 작업을
많이 반복하게 될 경우도 병렬을 쓰면 이점이 있는지 약간 헷갈려서요..
답변 기다리겠습니다.
Forums:
함수 호출간에 서로 의존성이 있나요? 예를 들어
함수 호출간에 서로 의존성이 있나요? 예를 들어 이전에 호출한 결과를 이후의 함수에 인자로 넘겨준다던지 말이죠.
만약 의존성이 있다면 스레드를 쓰든 OpenMP를 쓰든 절대로 병렬화 될 수 없습니다.
만약 의존성이 없다면 스레드를 쓰든 OpenMP를 쓰든 병렬화가 가능한데, 이 경우에는 병렬수가 많으니까 CUDA나 OpenCL과 같이 GPU를 활용하는 방법으로 작성하는 게 좋아보입니다. 왜냐면 GPU가 CPU에 비해서 연산 코어수가 압도적으로 많기 때문이죠.
생산적인 댓글을 달자
병렬화의 범위가 워낙 넓어서..
그냥 간단하게 분석해 보면.
SW레벨 Thread 방식과 HW레벨의 Multi-Process 방식으로 나누었을 때,
Thread 의 경우 timeslice를 효율적으로 처리하기 위한 방식입니다.
각 task의 쉬는시간(network i/o, disk i/o etc.) Process Power 를 잠깐 양도하는 개념입니다.
따라서 진행되는 작업 쉬는시간 거의 없이 process를 물고 늘어지는 경우에는,
Kernel 스케줄러가 애초에 정해놓은 timeslick를 다 소진해야지 thread 를 양보합니다.
반면 Multi-Process는
sohn9086 님이 언급하신 것처럼 특정 병목지점(임계구역)이 존재하지 않는 이상
약 1배 <= x < 2배 성능을 보여줍니다. (물론 각 CPU 벤더에서 제공하는 병렬 프로그래밍 코드를 사용하셔야 완벽히 보장됨)
물론 완전한 지식은 아닙니다.. 아무쪼록 판단하시는데 도움이 되었으면 좋겟습니다.
댓글 달기