목록C++ (21)
Creative Motive
데브피아 김경진님 작성 (http://devmachine.blog.me/181647367) 병렬 컨테이너와 오브젝트 PPL에서는 thread-safe 하게 사용할 수 있는 몇 가지의 병렬 컨테이너와 오브젝트를 제공합니다. 먼저 병렬 컨테이너는 기존 STL 컨테이너와 매칭되며 주요 메서드를 thread-safe 하게 사용할 수 있습니다. 그 예로 concurrency::concurrent_vector 클래스는 std::vector 클래스와 비슷하며 컨테이너 원소를 여러 스레드에서 동시에 추가할 수 있습니다. 하지만 앞서 주요 메서드라고 언급하였듯이 모든 메서드가 thread-safe 한 것은 아니라는 것은 알아두셔야 합니다. 그리고 앞으로 설명하게 될 병렬 컨테이너들은 모두 STL 컨테이너와 매칭되므로 차..
데브피아 김경진님 작성 (http://devmachine.blog.me/180972039) Parallel 정렬 PPL에서는 std::sort 함수를 대체할 수 있는 세 가지 버전의 병렬 처리 함수를 제공합니다. 바로 concurrency::parallel_sort, concurrency::parallel_buffered_sort, concurrency::parallel_radixsort 함수인데요, 이 세 가지 정렬 함수는 매우 큰 데이터셋을 정렬하는 경우 또는 정렬에 필요한 비교 구문이 복잡하여 시간이 오래 소요되는 경우에 아주 유용하며 성능 향상에 큰 도움이 됩니다. 먼저 parallel_sort 함수와 parallel_buffered_sort 함수는 std::sort 함수와 마찬가지로 비교 기반의..
데브피아 김경진님 작성 (http://devmachine.blog.me/177199502) Forwarding Problem 이번 강좌는 이해를 돕기 위해 자세한 설명 보다는 예제 위주로 설명을 드리려고 합니다. 쉽지 않은 개념이긴 하지만 차근 차근 따라오신다면 모두 이해가 될것으로 생각됩니다. 그럼 시작하겠습니다. ^^ 먼저 구조체 W, X, Y, Z를 정의하는데 각각의 구조체는 생성자의 파라미터 타입으로 const와 non-const 참조 타입을 받아들이는 4가지 조합을 가지게 합니다. struct W { W(int&, int&) {} }; struct X { X(const int&, int&) {} }; struct Y { Y(int&, const int&) {} }; struct Z { Z(con..
데브피아 김경진님 작성 (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의 병렬 알고리즘은 병렬 프로그래밍과 스레드에 대한 특별한 기반 지식 없이도 쉽게 사용할 수 있기 때문에 아마도 이번..