Grave stone
77
2018-10-16 00:08:12
7
1527

멀티코어 프로그래밍 실제로 해보신분 있나요?


사실 프로그램이 멀티코어 지원하면 좋다는 얘기는 많이 들어봤어도 실제로 그렇게 개발했다는 소리는 못들어본거 같고 저도 학교에서나 세마포어 개념 이론과 간단한 실습해본적은 있어도 그 이상의 멀티코어 프로그래밍은 해본적은 없었습니다.


실제 실무에서 멀티코어 프로그래밍 해본분 있나요? 만약 해봤다면 어떤식으로 제작되는지 궁금합니다.


0
0
  • 댓글 7

  • mirheeoj
    5k
    2018-10-16 08:20:41

    통계같은 건 없지만 일반 C/S 프로그램을 작업하시는 분들중에 멀티코어 지원 프로그램을 안해보신 분들은 매우 드물거란 생각입니다. 처리량이 조금만 늘어나도 반드시 할 수밖에 없게 되고, 애초에 언어 차원에서 쉽게 해당 작업을 할 수 있도록 지원해주는 추세라 크게 복잡하지도 않습니다. 해당 작업을 내부에서 지원하는 라이브러리를 쓰는 방법도 있고요. 예를 들어 동영상 인코딩 라이브러리들은 자체적으로 멀티스레딩을 지원하죠. 이런 걸 쓰면 따로 크게 신경 안 써도 멀티코어 지원 프로그램이 되는 겁니다. 문제발생시 해결은 여전히 까다롭긴 하지만요. 

    1
  • 애옹이
    239
    2018-10-16 09:03:01
    멀티코어 개발은 여러 분야에서 많이 필요로 합니다.
    저는 서버 개발자로 일 하고 있고, 만드는 프로그램은 모두 병렬로 돌아갑니다.
    기본적으로는 함수형 프로그래밍을 통한 병렬화, 엑터 모델 기반의 병렬화, 큰 데이터를 실시간으로 처리 해야 할 때는 아파치 Beam으로 병렬화 해서 개발합니다. 
    1
  • 인그니야
    301
    2018-10-16 09:03:11

    멀티코어는 OS단에서 처리하므로 그 위 레벨들로는 직접 컨트롤하는 건 어려운 걸로 알고 있습니다.

    1
  • 하마
    5k
    2018-10-16 11:39:41 작성 2018-10-16 12:03:56 수정됨

    상당히 오래전부터 현업에서 기본적으로 사용되어 왔습니다. 

    멀티쓰레딩이 포함되어 있지 않은 프로그래밍을 찾기가 더 힘들다고 봐야겠지요. 
    물론 얼마나 적극적으로 이용하냐와  최고의 효율로 코드를 작성하느냐는 별개의 문제지만..
    (얼마나 서로를 기다리지 않게 설계하는가, 노는 CPU를 최소화 하는가등 ) 

    윈도우응용프로그래밍 경우에 소켓통신 하는 거부터 멀티쓰레드를 사용하며, 태스크 처리시 쓰레드풀을 잘 이용하는 것은 기본중에 기본이며, 웹서버도 톰캣부터 멀티쓰레드 기반이니 자연스럽게 사용하고 있는 것이겠지요. 자바/python/golang 등 어떤 언어로 서버 만들때에도 멀티 쓰레드는 기본적으로 사용되며, 또한 데이터를 모으거나, 어떤 정보를 파싱해서 처리를 하거나, 동시에 시켜야 할 일이 있을 때도 많이 사용됩니다. 

    최근에는(?) 반대로(?) 1개의 코어로 비동기를 이용하여 최고의 효율을 꺼집어 내는 기술이 일반적으로 사용되고 있으며 (예를들어 Node), 하나의 명령으로 다중계산을 병렬적으로 발현시키는 GPGPU/SSE/AVX등도 그것이 필요한 분야에서는 적극적으로 사용됩니다. (컴퓨터 비전, 딥러닝, 볼륨랜더링등) 


    p.s 1
    혹시 웹벡엔드단에서 쓰레드를 직접 생성해서 사용 할 일이 있느냐/많느냐? 를 물어보는거라면
    질문을 다시 해야 겠지요.

    p.s 2
    참고로 멀티코어라는 말은 매우다양하게 사용 될 수 있으므로,이것 또한 명확히 정의해서 질문해야합니다.
    멀티쓰레딩을 이용하여 멀티코어를 사용할수도 있고, 다른 방법들도 있으니까요~

    1
  • aeba
    2018-10-16 13:01:22 작성 2018-10-16 14:28:17 수정됨

    자주 씁니다. 제가 일하는 코드베이스는 아무래도 순수함수형으로 짜다보니 메소드 시그니처에 이 함수는 병렬이라고 선언하고, 내부에서 사용하는 함수 이름만 바꿔주면 되는 정도로 간단합니다.


    병렬화 버전

    def parallelPrint[F[_]: Par](implicit F: Sync[F]): F[Unit] =
      (1 to 20).map(i => F.delay(print(i + " "))).toList.parSequence_ 

    싱글쓰레드 버전

    def sequentialPrint[F[_]](implicit F: Sync[F]): F[Unit] =
      (1 to 20).map(i => F.delay(print(i + " "))).toList.sequence_ 


    실행:

    parallelPrint[IO].unsafeRunSync() 
    //=> 1 4 3 2 5 6 7 9 13 15 17 18 19 20 14 12 11 8 10 16 
    
    sequentialPrint[IO].unsafeRunSync() 
    //=> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
    

    1
  • Grave stone
    77
    2018-10-16 22:52:54
    답변주신분들 감사합니다.
    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.