반응형
안녕하세요! 지난 글에서는 C++20/23 문법과 OpenCL C++ Wrapper를 활용해 OpenCL 코드를 훨씬 깔끔하게 만드는 방법을 살펴봤습니다. 이번 글에서는 실제로 유용할 수 있는 간단한 이미지 처리 예제를 통해 OpenCL의 이미지 기능을 체험해보려 합니다. 기본적인 버퍼 연산만 다뤘던 것에서 한 단계 나아가, GPU 가속을 활용한 이미지 변환(예: 컬러 이미지를 그레이스케일로 변환)을 시도해보죠.이번 글에서는 다음 내용을 다룹니다.이미지 객체를 사용한 데이터 처리호스트 측에서 이미지 로딩(예: stb_image 사용)OpenCL 커널에서 read_imagef, write_imagef 함수 활용결과 확인을 위한 이미지 저장CUDA와 비교: CUDA 텍스처/서피스와 유사한 개념1. 준비사항이..
C++23에서는 범위(Range) 라이브러리에 풍부한 알고리즘들이 추가되어, 데이터 처리 시 다양한 시나리오를 표준화된 방식으로 해결할 수 있게 되었습니다. 그중 하나인 std::ranges::sample 알고리즘은 범위에서 무작위로 일부 원소를 추출하여 샘플링할 수 있도록 하는 기능을 제공합니다. 이를 통해 무작위 데이터 선정, 표본 추출 등의 작업을 표준 라이브러리 알고리즘만으로 간편히 구현할 수 있습니다.이번 글에서는 std::ranges::sample의 개념과 사용법, 그리고 이전 방식과 비교하여 어떠한 개선점을 제공하는지 알아보겠습니다. std::ranges::sample란 무엇인가요?std::ranges::sample(rng, out, n, gen)는 범위 rng에서 원소를 n개 무작위로 선택..
C++23에서는 비동기 프로그래밍과 스레드 관리 패턴을 한층 더 간단하고 효율적으로 만들기 위해 std::in_place_stop_source와 std::in_place_stop_token이 도입되었습니다. 이들은 C++20에서 도입된 std::stop_source와 std::stop_token을 개선한 것으로, 비동기 작업이나 스레드 실행을 안전하고 직관적으로 중단(stop)할 수 있는 메커니즘을 제공합니다.기존의 std::stop_source/std::stop_token과 달리, in_place 버전은 무상태(stateless)로, 저장 비용이 줄고 더 가벼우며, 기본적으로 커스텀 메모리 관리나 동기화 없이도 안전하게 중단 신호를 전달하고 처리할 수 있습니다.이번 글에서는 std::in_place_s..
C++23에서는 범위(Range) 라이브러리를 더욱 강화하기 위해 다양한 뷰(View) 어댑터가 추가되었습니다. 그중 std::views::repeat와 std::views::repeat_n는 특정 값을 무한히 반복하거나, 지정된 횟수만큼 반복하는 시퀀스를 손쉽게 만들 수 있도록 해주는 뷰 어댑터입니다. 이를 통해 반복적인 데이터 소스를 간편하게 생성할 수 있으며, 다른 범위 어댑터와 결합하여 여러 가지 흥미로운 데이터 처리 파이프라인을 구성할 수 있습니다. 이번 글에서는 std::views::repeat와 std::views::repeat_n의 개념과 사용법, 그리고 이전 방식과 비교하여 어떠한 개선점을 제공하는지 알아보겠습니다. std::views::repeat란 무엇인가요?std::views::re..
C++23에서는 범위(Range) 라이브러리를 더욱 유연하고 표준화된 방식으로 다룰 수 있도록 하는 새로운 뷰(View) 어댑터들이 다수 추가되었습니다. 그중 하나인 std::views::common는 범위를 일반 범위(common_range)로 변환하여, 반복자와 센티넬 타입 불일치 문제를 해결하고, 다른 범위 기반 알고리즘과의 호환성을 개선하는 뷰 어댑터입니다. 이를 통해 범위를 다룰 때 흔히 발생하는 반복자-센티넬 타입 차이로 인한 번거로움을 줄이고, 코드 가독성과 유지보수성을 높일 수 있습니다.이번 글에서는 std::views::common의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 알아보겠습니다.std::views::common란 무엇인가요?C++20 범위 라이브러리에..
C++23에서는 범위(Range) 라이브러리에 다양한 알고리즘들이 추가되어, 데이터 처리 파이프라인을 한층 더 풍부하게 구성할 수 있게 되었습니다. 그중에서도 std::ranges::drop_last와 std::ranges::drop_last_while 함수는 범위의 끝부분에서 특정 개수나 조건에 맞는 원소들을 제거(drop) 하는 기능을 제공합니다. 이를 통해 기존의 std::ranges::drop가 범위의 앞부분을 제거하는 것에 더해, 뒷부분에 대해 유사한 조작을 간단하게 수행할 수 있게 되었습니다.이번 글에서는 std::ranges::drop_last와 std::ranges::drop_last_while의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 살펴보겠습니다.std::r..
C++23에서는 다양한 범위 라이브러리 및 형식화 출력, 오류 처리 기능 외에도, 기본 알고리즘을 확충하여 언어의 활용성을 높였습니다. 그중 하나인 std::byteswap 함수는 정수 타입의 바이트 순서(Byte order)를 간단히 역전시켜주는 함수로, 네트워크 프로그래밍이나 이진 파일 입출력, 하드웨어 종속적인 데이터 처리 등에서 유용하게 활용할 수 있습니다. 이 기능을 통해 개발자는 별도의 매크로나 사용자 정의 함수를 만들 필요 없이, 표준 라이브러리 함수 한 번의 호출로 정수 바이트 순서를 반전할 수 있습니다.이번 글에서는 std::byteswap의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 알아보겠습니다.std::byteswap란 무엇인가요?std::byteswap(T..
앞서 기본 구현을 통해 groupby, permutations, product를 C++로 옮기는 방법을 살펴봤습니다. 여기서는 C++20의 Concepts와 Ranges 라이브러리를 활용해 정교한(또는 확장된) 구현 방법을 간단히 예시로 보여드리겠습니다.파이썬스럽다는 것은 단순히 기능을 흉내내는 데 그치지 않고, 타입 안정성, 가독성, 모듈성까지 고려하는 것입니다. Concepts로 입력 타입을 제약하거나, Variadic Template로 product를 여러 컨테이너에 확장하는 예제를 살펴보죠.정교한(또는 확장된) 구현 예제1. groupby에 Concepts 적용하기groupby는 연속된 원소를 key 함수 결과에 따라 그룹화합니다. 여기서 key 함수는 원소를 받아 어떤 key로 매핑하는 Call..
이제까지 파이썬 itertools와 more-itertools의 다양한 함수를 C++로 옮기며, 현대 C++이 제공하는 Ranges, Concepts, lazy evaluation을 통해 얼마나 파이썬스러운 코드를 구현할 수 있는지 확인했습니다. 이번에는 takewhile, dropwhile, 그리고 accumulate를 C++에서 흉내 내는 방법을 살펴보겠습니다.먼저 파이썬에서 이 함수들이 어떻게 동작하는지 간단히 살펴볼까요?from itertools import takewhile, dropwhile, accumulate# takewhile(predicate, iterable)# predicate가 참인 동안만 원소를 반환하다가, 거짓이 되는 순간 멈춤data = [1,2,3,4,5,1,2]for x ..
여러분, 우리는 지금까지 파이썬 itertools와 more-itertools의 다양한 기능을 C++20/23 문법으로 흉내 내는 방법을 살펴보며, 파이썬스러운 추상화를 C++에서 어떻게 구현할 수 있는지 탐구해왔습니다. 이번 글에서는 unique_everseen, unique_justseen, 그리고 powerset를 C++로 옮겨보며, 더욱 풍부한 반복 패턴을 구현하는 방법을 알아보겠습니다.먼저 파이썬에서 이들 API를 간단히 살펴볼게요.from more_itertools import unique_everseen, unique_justseenfrom itertools import chain, combinations# unique_everseen(iterable)# 지금까지 본 적 없는 원소만 내보냄 ..