HPX parallel partition 알고리즘

이미지
안녕하세요. 오늘은 제가 예전에 HPX 라는 오픈소스에 구현했던 parallel partition 알고리즘에 대해 간단히 소개하고 설명하는 시간을 가져보도록 하겠습니다. 출처 먼저 이 포스팅에서 다루는 알고리즘/코드의 출처는 다음과 같습니다. HPX : https://github.com/STEllAR-GROUP/hpx 관련 MR : https://github.com/STEllAR-GROUP/hpx/pull/2778 소스코드 : https://github.com/STEllAR-GROUP/hpx/blob/master/hpx/parallel/algorithms/partition.hpp 소개 parallel partition 알고리즘은 여러 개의 연산 유닛 (쉽게 말하면 cpu) 들을 이용해서 partition 알고리즘을 수행하는 것을 말합니다. 이 포스팅에서는 독자가 partition 알고리즘에 대해서 이미 알고있다고 가정합니다. partition 알고리즘에 대한 설명은 cppreference 를 참고하시기 바랍니다. 알고리즘 설명 partition 알고리즘은 주어진 영역을 정해진 규칙을 만족하는지 아닌지에 따라 두 영역으로 분류하는 알고리즘입니다. 예를 들어, 짝수인지 여부에 대해 partition 알고리즘을 수행한다고 하면 결과는 다음과 같습니다. 적용 전 : 3 5 7 4 2 1 9 8 6 적용 후 : 6 8 2 4 * 7 1 9 5 3 즉, partition 알고리즘의 핵심은 다음과 같습니다. 두 영역을 구분할 수 있는 boundary 를 찾는다. 그 boundary 의 왼쪽에는 조건을 만족하는 원소들이, 오른쪽에는 조건을 만족하지 않는 원소들이 위치하게 된다. 자, 위의 핵심을 기억하면서 parallel partition 알고리즘을 살펴보도록 합시다. 결론적으로 parallel partition 알고리즘은 크게 4단계로 이루어집니다. 주어진 영역을 여러 개의 block 으로 쪼개서 병렬로 sub-pa...

Rust Procedural Macros By Example

이미지
안녕하세요. 제가 최근에 Rust 공부를 시작했는데요~ 그래서 오늘은 Rust 1.29.0 부터 stable 이 된 Procedural Macros 에 대해서 포스팅해보도록 하겠습니다. 포스팅은 구구절절한 설명보다는 예제 코드 위주가 될 예정입니다! Rust 의 매크로 시스템 Rust 의 매크로 시스템은 매우 강력한데요. 크게 다음과 같이 분류 할 수 있습니다. Declarative Macros Procedural Macros Function-like macros Derive mode macros Attribute macros 첫 번째는 Declarative Macros 는 일반적으로 개발자들이 흔히 알고 있는 “선언적” 형태의 매크로 방식인데요. C/C++ 등의 타언어들과의 차이점은 문자열 전처리기 방식이 아니라 Abstract Syntax Tree 를 직접 건드리는 방식이라는 점입니다. // 출처 : https://doc.rust-lang.org/rust-by-example/macros/dsl.html macro_rules! calculate { ( eval $e : expr ) = > { { { let val : usize = $e ; // Force types to be integers println! ( "{} = {}" , stringify! { $e } , val ) ; } } } ; } fn main ( ) { calculate! { eval 1 + 2 // hehehe `eval` is _not_ a Rust keyword! } calculate! { eval ( 1 + 2 ) * ( 3 / 4 ) } } Declarative Macros 는 이번 포스팅의 주제가 아니므로, ...

C++ Boost 라이브러리를 Windows XP 에서 동작하도록 빌드하기

이미지
안녕하세요~ 반갑습니다! C++ 개발자 여러분~ boost 많이 쓰시죠?? 저도 boost 참 좋아합니다 ㅎㅎ 이렇게 좋은 boost 를 Windows XP/2003 환경에서 사용할 때는 그냥 일반적인 방법으로는 사용이 불가능한데요. 그래서 오늘은 Windows XP 환경에서 동작하도록 boost 를 빌드하는 방법에 대해서 알아보도록 하겠습니다! 참고로 제가 설명할 방법은 100% 완벽하게 검증된 방법은 아니며, 제가 조사/연구를 통해 알아낸 방법입니다. 따라서 문제가 있을 수도 있으므로 참고자료정도로만 사용해주시면 감사하겠습니다. 그리고 이 포스팅에서는 Visual C++ 2015 Update 3 를 사용한다고 가정하고 설명하겠습니다. 또한, 이 포스팅에서 말하는 Windows XP 는 정확히 말하면 XP Service Pack 3 를 뜻합니다. 1단계) 사용하려는 라이브러리가 XP 를 지원하는 지 확인한다. 일단 첫 번째 단계는 사용하려는 라이브러리가 Windows XP 를 지원하는 지 확인하는 과정입니다. 다행히도 Boost 의 대부분 라이브러리는 XP 환경에서 잘 돌아갈텐데, 경우에 따라서 XP에서는 기능이 제한되거나 오동작을 일으킬 수 도 있으니, 라이브러리가 XP 를 지원하는 지 여부를 검토할 필요성이 있습니다. 근데 아쉽게도 라이브러리들이 XP 를 지원하는 지 여부가 명백하게 정리된 글같은 건 없어 보입니다 ㅜㅜ 그리고, 각 라이브러리의 레퍼런스를 봐도 잘 안나오는 경우가 많죠. 결국, 부스트 커뮤니티 혹은 스택오버플로우의 글들을 뒤지거나 직접 질문을 해서 도움을 얻어야 합니다. 그리고 직접 라이브러리 내부 소스코드를 까서 XP 지원 여부를 파악해야 할 수도 있습니다. 그리고, 무엇보다 실제로 라이브러리를 사용하는 프로그램을 XP에서 동작시켜서 잘 동작하는지 직접 확인하는 과정도 꼭 필요합니다. 이 글 은 2015년도에 부스트 커뮤니티에 올라왔던 Windows XP 지원 관련 설문인데 한번 읽어보셔도 좋을 것 같습니다. XP...