목록전체 글 (57)
Creative Motive
데브피아 김경진님 작성 (http://devmachine.blog.me/176806250) Rvalue Reference 속성 함수 파라미터로 Lvalue 또는 Rvalue를 전달받고 이에 따른 처리가 달라지는 함수를 구현할 경우 각각 Lvalue reference와 Rvalue Reference를 파라미터로 사용하는 오버로드 함수를 작성할 수 있습니다. 아래 예제에서는 const lvalue reference와 rvalue reference를 각각 파라미터로 전달받는 오버로드 함수를 작성하고 Lvalue와 Rvalue를 이용해 오버로드 함수를 호출하였을 경우 어떤 함수가 호출되어지는지 보여줍니다. #include using namespace std; class MemoryBlock { // Memory..
데브피아 김경진님 작성 (http://devmachine.blog.me/176442133) Move Semantics Move Semantics란 객체의 리소스(동적으로 할당 된 메모리와 같은)를 또 다른 객체로 전송(이동)하는 것을 의미합니다. 앞에서 살펴보았던 Rvalue 참조자는 Move Semantics의 구현을 가능하게 하고 이로 인해 상당한 성능을 향상시킬 수 있습니다. Rvalue는 프로그램 어디에서도 참조될 수 없는 임시 객체이지만 Rvalue 참조자를 이용하여 임시 객체의 리소스를 이동시킴으로서 쓸데없는 메모리 할당과 복사 작업을 생략하여 성능이 향상되는 것이죠. 복잡한 설명보다는 간단한 예제를 보면서 설명을 드리는게 좋을 것 같네요. 메모리 버퍼를 관리하는 MemoryBlock 이라는 ..
데브피아 김경진님 작성 (http://devmachine.blog.me/176176191) C++ Lvalue와 Rvalue에 대한 오해 Lvalue와 Rvalue는 보통 Left-value(왼쪽값)과 Right-value(오른쪽값)로 풀어서 씁니다. 이 때문에 대입 연산자(=)를 기준으로 왼쪽에 위치하는 값이 Lvalue이고 오른쪽에 위치하는 값이 Rvalue라고 이해하고 계신 분들이 많습니다. 이것은 C 표준에 입각하여 살펴보면 완전히 틀린 얘기는 아니지만(C 표준에서는 대입 연산자(=)를 기준으로 왼쪽과 오른쪽에 모두 사용될 수 있는 값은 Lvalue이고 오른쪽에만 사용될 수 있는 값이 Rvalue라고 정의하고 있습니다) 잘못된 이해이며, C++ 관점에서는 전혀 다른 관점에서 해석할 필요가 있습니다..
데브피아 김경진님 작성 (http://devmachine.blog.me/179590295) parallel_invoke parallel_invoke 함수는 여러개의 작업을 병렬로 실행해주는 함수입니다. 지난 task 그룹 강좌를 보신 분들이라면 parallel_invoke 함수가 낯이 익으실 지도 모르겠네요. 그 당시에 structured_task_group 클래스를 설명하면서 간결하고 직관적인 코드 작성을 위해 structured_task_group 객체를 직접 생성하여 사용하는것 보다 parallel_invoke 함수를 사용하는 것이 좋다고 설명드린 적이 있습니다. parallel_invoke 함수는 서로 독립적인 작업 몇 개를 동시에 실행하고자 할 때 유용하게 사용할 수 있습니다. parallel_..
데브피아 김경진님 작성 (http://devmachine.blog.me/179227204) 병렬 알고리즘 PPL에서는 데이터 집합(배열, vector 등등..)을 기반으로 작업을 동시에 처리할 수 있는 알고리즘 함수들을 제공합니다. 이런 병렬 알고리즘 함수들은 기존에 STL에서 사용하던 알고리즘 함수와 사용 방법이 거의 비슷하다는 장점을 가지고 있습니다. 이러한 장점 때문에 STL 알고리즘 함수를 사용해 본 경험이 있는 분들은 별 다른 어려움 없이 코드를 이해할 수 있을 뿐만 아니라 기존에 STL 알고리즘을 이용하여 구현된 코드를 PPL의 병렬 알고리즘으로 쉽게 변환할 수 있습니다. PPL의 병렬 알고리즘은 병렬 프로그래밍과 스레드에 대한 특별한 기반 지식 없이도 쉽게 사용할 수 있기 때문에 아마도 이번..
데브피아 김경진님 작성 (http://devmachine.blog.me/178941103) task 그룹 task 그룹은 여러개의 task를 그룹에 추가하여 실행하고 종료를 대기하거나 취소 작업을 가능하게 하는 객체입니다. 앞선 강좌에서 여러개의 task가 모두 종료될 때 까지 대기하기 위하여 각각의 task를 생성하여 실행하고 when_all 함수를 사용하여 대기하도록 구현하였습니다. 이와 같은 동작을 task 그룹을 이용하면 task 그룹의 wait 메서드를 통하여 구현할 수 있으며 여러개의 연관된 task의 취소 작업도 task 그룹의 cancel 메서드를 이용하여 구현이 가능합니다. task 그룹의 취소에 대해서는 PPL 강좌 후반부에서 자세히 설명하도록 하겠습니다. task_handle task..
데브피아 김경진님 작성 (http://devmachine.blog.me/178724927) 중첩된 task 지금까지 task의 then 메서드를 통한 task 연결 방법에 대하여 살펴보았습니다. 부모 task와 자식 task를 구성하는 방법, 즉 어떤 task를 먼저 실행하고 task가 종료되면 다음 task를 실행하는 방법에는 then 메서드를 이용한 방법 외에 또 한 가지 방법이 있습니다. 바로 중첩된 task(nested task)을 이용한 방법입니다. 중첩된 task란 task 내부에서(outer task) 또 다른 task를 생성하여(inner task) 생성한 task를 리턴하는 방식으로 inner task는 outer task가 종료되면 실행됩니다. 나머지는 예제를 통해서 자세히 알아보시죠...
데브피아 김경진님 작성 (http://devmachine.blog.me/178262872) task 클래스 task는 병렬 프로그래밍에서 하나의 작업 단위를 표현하는 템플릿 클래스 입니다. PPL에서 가장 기본이 되는 개념으로 사용자는 직접적 또는 간접적 방법에 의해 task를 사용하게 됩니다. 간접적 방법이라 언급한 것은 이후에 나오게 될 병렬 알고리즘 같은 경우 겉으로 드러나진 않지만 내부적으로는 task_handle을 이용하여 구현이 되어 있기때문에 사용자가 직접 task 클래스를 생성하여 사용하지 않아도 간접적으로 task를 이용하게 된다는 의미입니다. 결국 task를 빼놓고는 PPL을 설명할 수 없다는 얘기겠죠? ^^ 그럼 task를 어떻게 생성하고 사용할 수 있는지 간단한 예제를 통해 알아보겠..