목록C++ (21)
Creative Motive
데브피아 김경진 님 작성 (http://devmachine.blog.me/186444629) 8. 작업 취소와 예외 처리가 객체 소멸에 미치는 영향을 이해할것 부모 Task 그룹과 자식 Task 그룹으로 구성된 병렬 작업 트리에서 부모 Task 그룹이 취소되면 자식 Task 그룹도 취소되어 더이상 실행되지 않는다는 특징을 가지고 있습니다. 이러한 메카니즘은 필요없는 연산을 수행하지 않도록 해주고 매끄럽게 병렬 작업 트리를 중단하는데 도움이 되지만, 만약 자식 Task가 리소스를 해제하는 등의 중요한 작업을 담당하고 있다면 문제가 발생하게 됩니다. 지금부터 설명할 예제에서는 리소스를 의미하는 Resource 클래스와 이 리소스를 담는 컨테이너 역할을 하는 Container 클래스를 선언하고 Containe..
데브피아 김경진 님 작성 (http://devmachine.blog.me/186321804) 5. 병렬 루프를 빠져나오려면 Cancellation 또는 Exception 을 이용할것 PPL에서 Task 그룹 또는 병렬 알고리즘의 작업을 취소하기 위한 방법에는 크게 두가지가 있습니다. 한가지 방법은 Cancellation 메카니즘을 이용하는 것이고 다른 방법은 Exception 핸들링을 이용하는 것으로 이는 앞서 설명된 12장 강좌 에서 모두 설명되었던 내용입니다. 병렬 작업 트리를 취소할 때에는 취소 상태를 부모로부터 자식들에게 전파되는 하향식 방법인 Cancellation 메카니즘을 이용하여 구현하면 효율적으로 작업을 취소할 수 있습니다. 아울러 parallel_for와 같은 병렬 알고리즘을 취소할 경..
데브피아 김경진님 작성 (http://devmachine.blog.me/186021205) 1. 작업량이 작은 루프는 병렬 처리하지 말것 PPL을 이용한 병렬 처리는 리소스를 최대한 활용하여 작업을 빠르게 처리할 수 있다는 장점을 가지고 있지만 이에 따른 스케줄링 오버헤드도 발생합니다. 만약 병렬 루프 안에서 작은 양의 작업을 수행할 경우에는 스케줄링 오버헤드가 병렬 처리로 얻는 이득보다 커지는 상황이 발생할 수 있습니다. 지금 설명하고 있는 '작업량이 작은 루프'는 루프 안에서 처리하는 내용의 크기를 얘기하는 것이지 루프의 반복 횟수를 얘기하는 것이 아니라는 것을 유념하시기 바랍니다. 그럼 이에 관한 예제를 살펴보도록 하죠. #include #include using namespace concurren..
데브피아 김경진 님 작성 (http://devmachine.blog.me/185000684) 병렬 알고리즘 취소 parallel_for 와 같은 병렬 알고리즘을 사용할 때 for 루프에서 break 를 사용하여 루프를 중단하고 빠져나오는 것처럼 자연스럽게 작업을 취소하려면 어떻게 해야할까요? 만약 우리가 병렬 작업의 취소 방법에 대해 모르고 있었다면 다음과 같은 방법으로 구현해 볼 수 있을겁니다. #include using namespace concurrency; int wmain() { // 취소 플래그 bool canceled = false; parallel_for(0, 100, [&](int i) { // i 값이 50일 경우 취소 플래그 설정 if (i == 50) { canceled = true..
데브피아 김경진 님 작성 (http://devmachine.blog.me/184536871) 병렬 작업 트리 지난 강좌까지는 병렬 작업을 취소하기 위한 첫번째 방법인 Cancellation Token을 이용한 방법에 대하여 설명드렸었고 이번 강좌에서는 병렬 작업을 취소할 수 있는 나머지 두 가지 방법에 대하여 설명하려합니다. 이후 설명에 대한 이해를 돕기 위해 먼저 Task와 Task 그룹을 이용하여 병렬 작업 트리를 구성하는 방법을 살펴보도록 하죠. PPL에서는 자식 Task 내부에 Task 그룹을 포함(중첩)시키는 방식으로 다음과 같은 작업 트리를 구성할 수 있습니다. Task 그룹 tg1은 3개의 Task t1, t2, t3 를 실행하며 Task t1의 내부에서는 또 다른 Task 그룹인 tg2를 ..
데브피아 김경진 님 작성 (http://devmachine.blog.me/183813004) Cancellation 상속 부모-자식 관계에 있는 Task(연결된 Task)에서 부모 Task의 작업을 취소했을 경우 자식 Task에게 Cancellation이 상속된다는 특징을 가지고있습니다. Cancellation 상속이란 부모 Task가 취소되어 canceled 상태가 되면 자식 Task 역시 취소되어 실행되지 않고 canceled 상태를 계승하는 것을 얘기합니다. 지난 강좌 '[VC++] 병렬 프로그래밍 완전 정복 #2 - task (1)' 편에서 value 기반의 연결과 task 기반의 연결의 차이점에 대하여 설명하다가 부모 task가 취소되었을 때의 자식 task의 동작에 대해 언급했던 내용을 기억하..
데브피아 김경진님 작성 (http://devmachine.blog.me/182050046) PPL 병렬 작업의 취소 PPL 에서는 병렬 작업을 수행하다가 임의의 상황에서 실행하던 작업을 취소할 수 있게 해주는 몇 가지 방법을 제공합니다. 이번 강좌부터는 PPL이 제공하는 병렬 작업의 취소가 어떠한 방식으로 이루어지며 어떻게 동작하는지에 대해 알아보도록 하겠습니다. 일단 자세한 설명에 앞서 꼭 기억하고 있어야할 키포인트 몇 가지를 말씀드리고 넘어가도록 하죠. 병렬 작업의 취소는 즉시 이루어지지 않는다. 다시 얘기하자면 취소는 '취소 요청' 이지 '강제 취소' 가 아니다. 취소 작업은 취소를 요청하는 측과 취소 요청에 응답하는 측의 상호 협력적인 코드 작성으로 이루어진다. 병렬 작업의 취소는 크게 3가지 방..
데브피아 김경진님 작성 (http://devmachine.blog.me/182050046) concurrent_unordered_map concurrency::concurrent_unordered_map 클래스는 std::unordered_map 클래스에 대응하는 병렬 컨테이너입니다. key/value pair 원소를 컨테이너에 추가하여 key를 가지고 value 값을 검색하는 전형적인 dictionary 개념의 컨테이너죠. concurrent_unordered_map 클래스는 여러 스레드 또는 task 에서 컨테이너를 공유하여 동시에 원소를 추가하고 엑세스 하려는 경우에 유용하게 사용될 수 있습니다. 먼저 std::unordered_map 과의 차이점부터 살펴보도록 하죠. erase, bucket, b..