반응형
안녕하세요! 지난 글들에서 우리는 파이썬 itertools의 다양한 기능—range, enumerate, zip, map, filter, chain, takewhile, dropwhile, accumulate, groupby—를 C++에서도 나름 “파이썬스럽게” 구현하거나 표현하는 방법을 두루 살펴봤습니다. 이번에는 itertools의 대표적인 조합론적(iteration over combinations) 함수들인 product, permutations, combinations를 살펴보려고 합니다. 이 함수들은 파이썬에서 꽤 자주 쓰입니다. 예를 들어 product([1,2],[3,4])는 (1,3), (1,4), (2,3), (2,4)를 만들어내고, permutations([1,2,3], 2)는 (1,2..
여러분, 지난 글들에서 우리는 C++에서 파이썬의 range, enumerate, zip, map, filter, chain, takewhile, dropwhile 등을 흉내 내는 방법을 쭉 살펴봤죠. 이제는 또 다른 파이썬 itertools의 매력적인 부분으로 넘어가려고 합니다. 바로 accumulate(파이썬 itertools의 accumulate), 그리고 groupby입니다. accumulate는 요소들을 순회하면서 누적 합이나, 누적 연산 결과를 차곡차곡 모아줍니다. 파이썬에서는 itertools.accumulate([1,2,3,4], operator.mul) 이렇게 사용해 곱셈 누적을, operator.add를 사용해 합 누적을 손쉽게 할 수 있습니다. C++에도 std::accumulate라..
앞선 글들에서 우리는 파이썬의 range, enumerate, zip, map, filter와 같은 편리한 함수형 API를 C++20/23 문법과 Ranges 라이브러리 등을 통해 “파이썬스럽게” 구현하는 방법을 살펴보았습니다. 이번 글에서는 한 단계 더 나아가, 파이썬의 itertools 라이브러리가 제공하는 몇 가지 대표적인 툴을 C++ 스타일로 흉내 내보려 합니다. itertools는 파이썬에서 반복 가능한(iterable) 시퀀스를 다루는 데 매우 유용한 툴셋을 제공합니다. 그중에서도 chain, takewhile, dropwhile는 다양한 컨테이너나 이터러블을 직관적이고 유연하게 다룰 수 있게 해줍니다. 글의 구성은 다음과 같습니다:일반적인 C++ 구현 (Before): 파이썬 chain, t..
앞선 글들에서 우리는 파이썬의 range, enumerate, zip와 유사한 C++ 구현 방식을 살펴보았습니다. 파이썬의 직관적 문법을 C++20/23의 언어와 라이브러리 기능들을 통해 비교적 쉽게 재현할 수 있음을 확인했죠. 이번 글에서는 파이썬에서 자주 사용하는 함수형 스타일의 API인 map과 filter를 C++에서 어떻게 “파이썬스럽게” 구현할 수 있는지 다뤄보겠습니다. 파이썬의 map(function, iterable), filter(predicate, iterable)를 C++20/23에서 비슷한 느낌으로 쓸 수 있다면, 복잡한 로직을 더 간결하고 깔끔하게 표현할 수 있습니다. 글의 구성은 다음과 같습니다:일반적인 C++ 구현 (Before): 람다, std::transform, std::..
이제까지 우리는 CUDA의 기본 문법, 메모리 계층, 비동기 스트림, 2D 데이터 처리 등 다양한 기초 개념을 다뤄왔습니다. 하지만 이 모든 것이 현업이나 프로젝트에서 활용되기 위해서는 체계적인 빌드 환경과 현대적 C++ 기능과의 자연스러운 결합이 중요합니다. 이번 글에서는 CMake를 통한 빌드 시스템 설정 방법과 C++20/23 기능(Coroutine, Concept, Constexpr, Lambda 개선 등)을 CUDA 코드와 융합하여 더 깔끔하고 유지보수하기 쉬운 코드를 만드는 방법을 살펴보겠습니다.CMake로 CUDA 빌드 환경 현대적으로 관리하기기본 구조 복습이전 글에서 간단히 소개했듯이, CMake는 CUDA를 별도의 언어로 인식하고, project(... LANGUAGES CUDA CXX)..
안녕하세요! 지난 글들에서 OpenCL의 기본 사용법을 어느 정도 파악하셨다면, 이제는 조금 더 현대적인 C++ 문법과 래퍼(wrapper) 라이브러리를 활용해 코드를 깔끔하게 정리하는 방법을 살펴보려고 해요. OpenCL 기본 API는 C 스타일 함수들로 구성되어 있고, 초기화 및 에러 처리 로직이 장황해지는 경우가 많은데, C++20/23 기능을 적극 활용하면 가독성과 유지보수성을 크게 높일 수 있습니다.이번 글에서는 다음 내용을 다룹니다.OpenCL C++ Wrapper(CL.hpp) 라이브러리 소개스마트 포인터, 범위 기반 for문, 구조적 바인딩 등 C++20/23 기능 활용에러 처리와 RAII(Resource Acquisition Is Initialization) 패턴 적용CUDA와 비교: C..
지난 글에서 우리는 파이썬의 range, enumerate를 C++20/23 스타일로 구현해보며 파이썬스러운 간결성과 C++의 성능을 결합하는 방법을 살펴보았습니다. 이번 글에서는 파이썬에서 자주 사용하는 또 하나의 유용한 함수 zip을 다뤄보겠습니다.파이썬의 zip은 여러 이터러블(리스트, 튜플 등)을 병렬로 순회하며 각 원소를 튜플로 묶어 돌려줍니다. 예를 들어:for x, y in zip([1,2,3], ['a','b','c']): print(x, y)이렇게 하면 (1, 'a'), (2, 'b'), (3, 'c') 순으로 받을 수 있습니다. C++에서 이와 비슷한 기능을 구현하려면 어떻게 할까요? C++17 이전에는 주로 인덱스를 수동 관리하거나, Boost 라이브러리를 쓰거나, 범위 기반 f..
C++ 코드를 작성하다 보면, 파이썬의 range, enumerate 같은 직관적이고 깔끔한 반복 구문이 부러울 때가 있습니다. 예를 들어 for i in range(10)라고만 쓰면 0부터 9까지 편하게 순회할 수 있고, for idx, val in enumerate(obj)로 인덱스와 값을 동시에 받아오는 문법은 가독성을 크게 높여줍니다. 이 글에서는 C++17, C++20, C++23에 걸쳐 제공되는 기능들을 활용해 파이썬스러운 API를 구현하고, 다양한 상황에서의 사용 예제와 성능, 유연성에 대해 살펴보겠습니다. 구성은 다음과 같습니다:일반적인 C++ 구현 (Before)기존 C++ 스타일로 인덱스와 값을 처리하는 방식.단순한 Python 같은 C++ 구현 (After: 첫 단추)C++17에서도 ..
안녕하세요! 지난 글에서는 OpenCL 커널 작성법과 빌드 과정을 살펴보았습니다. 이제 커널에서 다룰 데이터가 어떻게 GPU나 CPU 디바이스 메모리에 올라가는지, 즉 OpenCL 메모리 모델과 그 핵심 요소인 버퍼(Buffer)와 이미지(Image)에 대해 알아볼 차례예요. 또한 커널에 파라미터(인자)를 전달하는 다양한 패턴에 대해서도 간단히 짚어보겠습니다.이번 글에서는 다음 내용을 다룹니다.OpenCL 메모리 모델 개요버퍼(Buffer)와 이미지(Image)의 특징과 사용 예커널 파라미터 설정 방법 심화CUDA의 메모리 관리 방식과 비교추가 참고 자료 (유튜브)1. OpenCL 메모리 모델 개요OpenCL 프로그램에서는 호스트(Host)가 디바이스(Device)에 연산을 시킵니다. 이 때, 데이터를 ..
지난 글에서는 2D 데이터 처리와 비동기 스트림(Asynchronous Streams)을 통해 Host와 Device 간 연산이 겹칠 수 있음을 확인했습니다. 이제는 GPU 메모리 계층을 살짝 들여다보고, 성능 최적화를 위해 왜 이러한 구조가 존재하는지 알아볼 차례입니다. 오늘 다룰 주제는 Shared Memory와 Constant Memory라는 특별한 메모리 공간들입니다. 이들은 단순한 글로벌 메모리(Global Memory) 접근보다 훨씬 더 빠르거나 특정 상황에서 효율적인 접근을 가능하게 해줍니다.메모리 계층 구조 이해하기GPU 메모리는 단순하지 않습니다. 성능을 극대화하기 위해 다양한 메모리 종류가 존재합니다.Global Memory(전역 메모리): 우리가 지금까지 cudaMalloc로 할당한 ..