반응형
2025년 현재, 모던 C++ 개발자는 더 이상 std::auto_ptr를 사용하는 모습을 보기 어렵습니다. auto_ptr는 C++98/03 시절 스마트 포인터의 초기 시도로 등장했으나, 그 독특하고 혼란스러운 소유권 전이(transfer) 방식으로 인해 많은 문제를 야기했습니다. 결국 C++11 이후 auto_ptr는 사용이 권장되지 않는(deprecated) 상태가 되었고, C++17에서는 완전히 제거되었습니다.이 글에서는 과거에 auto_ptr가 어떻게 사용되었는지, 그리고 그것이 어떤 문제를 일으켰는지 살펴봅니다. 이후 std::unique_ptr 및 std::shared_ptr가 등장함으로써 C++ 메모리 관리가 어떻게 개선되었는지, 그리고 이 변화가 왜 필수적이었는지 분석하겠습니다.관련 참고..
기존 DQN에서는 모든 경험을 동일한 확률로 샘플링합니다. 그러나 강화학습에서는 특정 경험(transition)이 학습 초기에는 별로 도움이 안 되지만, 나중에 정책이 개선되면서 가치가 달라지거나, 에이전트가 특정 상황에서 큰 TD 오차(Temporal-Difference Error)를 낼 경우 그 경험이 정책 개선에 더 크게 기여할 수 있습니다.우선순위 경험 리플레이(PER)의 핵심 아이디어는 TD 오차가 큰(즉, 현재 네트워크의 예측과 실제 타겟 간 차이가 큰) 경험을 더 자주 샘플링하는 것입니다. 이를 통해 에이전트는 정책 개선에 유용한 경험을 빠르게 재학습하고, 경험 데이터 활용 효율을 높일 수 있습니다.참고자료:Schaul et al., 2016. "Prioritized Experience Re..
안녕하세요! 지난 글에서는 OpenCL을 활용한 이미지 처리 예제를 다루며, 실제로 GPU 가속의 이점을 경험해봤습니다. 이제부터는 좀 더 깊은 주제로 들어가, 성능 최적화(Performance Optimization)에 대한 기본 개념을 살펴보려 해요. 입문자 수준에서 모든 최적화를 다루기는 어렵지만, 워크그룹(work-group) 설정, 메모리 접근 패턴 개선, 그리고 프로파일링(profiling) 도구 활용으로 성능을 개선할 수 있는 아이디어를 얻을 수 있습니다.이번 글에서는 다음 내용을 다룹니다.워크아이템(work-item), 워크그룹(work-group) 개념과 성능 관계메모리 계층(global, local, private memory)과 접근 패턴 최적화프로파일링을 통한 병목 지점 확인CUDA..
이번 글에서는 CMake를 사용하여 SIMD(Single Instruction, Multiple Data) 기반의 응용 프로그램을 구성하고 빌드하는 방법을 더욱 자세히 알아보겠습니다. SIMD는 데이터 병렬 처리를 통해 성능을 향상시키는 기술로, 멀티미디어 처리, 신호 처리, 과학 계산 등 다양한 분야에서 활용됩니다. 이번 글에서는 다양한 운영체제, CPU 아키텍처, 컴파일러에 따른 컴파일러 플래그와 옵션 설정 방법을 자세히 살펴보고, 크로스 빌드 상황에서 필요한 설정과 라이브러리, 툴에 대해서도 알아보겠습니다. 또한, 조건부 빌드의 다양한 사례를 통해 실전에서의 활용 방법을 제시하겠습니다.SIMD와 CMake의 통합SIMD 명령어 집합은 CPU 아키텍처와 세대에 따라 다르며, 이를 활용하기 위해서는 컴..
이전 글에서는 러스트의 에러 처리 철학, Result와 Option, panic! 매크로를 통해 예외 없이 명시적으로 에러를 처리하는 방식을 살펴보았습니다. 이제는 러스트가 무엇보다 강력하게 내세우는 장점 중 하나인 동시성(Concurrency)과 병렬성(Parallelism) 지원에 대해 알아보겠습니다. C++도 C++11 이후 std::thread, std::mutex, std::atomic 등을 통해 멀티스레딩을 지원하지만, 여전히 개발자가 락(Lock) 관리나 데이터 경쟁(Race Condition), 댕글링 포인터 문제에 신경 써야 합니다. 반면 러스트는 언어 차원에서 안전성 보장을 강화하여, 고성능 병렬 코드를 작성하면서도 메모리 안전성과 데이터 경쟁 방지를 지원합니다.기본 스레드 사용하기러스..
이제 여기까지 왔습니다! 우리가 지금까지 다룬 내용을 바탕으로, 간단한 실전 예제를 통해 모든 개념을 종합해볼 시간입니다. 이번 글에서는 이미지 처리 예제를 선택하겠습니다. 이유는 다음과 같습니다:2D 데이터 처리(블록/스레드 2D 설정) 개념 확립Shared Memory나 Constant Memory를 활용해볼 수 있는 기회비동기 스트림으로 데이터 전송과 연산 오버랩 시도Modern C++ 빌드 및 언어 기능을 통한 코드 가독성 개선디버깅 및 프로파일링 연습“간단한 이미지 필터” 예제를 통해 실제 GPU 코드가 어떻게 구조화되고, 이전에 배운 개념들이 어떻게 융합되는지 살펴보겠습니다.실전 예제 개요: 간단한 블러(Blur) 필터 적용하기우리가 구현할 내용은 다음과 같습니다.Host에서 이미지를 로딩 (..
DQN 계열 알고리즘의 핵심은 상태-행동 가치(Q-value)를 효과적으로 추정하는 것입니다. 지금까지의 네트워크는 상태를 입력받아 각 행동에 대한 Q값을 직접 출력하는 구조를 사용했습니다. 그러나 모든 행동에 대한 Q값을 별도로 추정하는 것은 비효율적일 수 있습니다. 상태 자체의 "가치(Value)"와, 그 상태에서 특정 행동을 선택함으로써 추가로 얻을 수 있는 "우위(Advantage)"를 분리하면, 공통적인 상태 가치를 학습하면서도 행동별 차이를 더 효율적으로 포착할 수 있습니다.Dueling DQN(Dueling Network Architecture for Deep Reinforcement Learning)에서는 Q(s,a)를 다음과 같이 분해합니다.Q(s,a) = V(s) + A(s,a) - 평..
이번 글에서는 CMake를 사용하여 OpenCL 기반의 응용 프로그램을 구성하고 빌드하는 방법을 알아보겠습니다. OpenCL은 이기종 시스템에서 병렬 프로그래밍을 위한 프레임워크로, CPU, GPU, FPGA 등 다양한 디바이스에서 실행할 수 있는 코드를 작성할 수 있습니다. CMake를 활용하여 OpenCL 프로젝트를 효율적으로 관리하고 빌드 시스템에 통합하는 방법을 살펴보겠습니다.OpenCL과 CMake의 통합OpenCL 프로젝트를 CMake로 빌드하려면 OpenCL 헤더와 라이브러리를 설정하고, CMake에서 이를 올바르게 찾고 링크해야 합니다. OpenCL은 Khronos Group에서 표준을 정의하며, 각 하드웨어 제조사에서 구현체를 제공합니다.OpenCL 설치Intel CPU: Intel Op..
이번 글에서는 CMake를 사용하여 Vulkan 기반의 그래픽스 응용 프로그램을 구성하고 빌드하는 방법을 알아보겠습니다. Vulkan은 차세대 그래픽 및 컴퓨팅 API로, 고성능과 낮은 오버헤드를 제공합니다. CMake를 활용하여 Vulkan 프로젝트를 효율적으로 관리하고 빌드 시스템에 통합하는 방법을 살펴보겠습니다.Vulkan과 CMake의 통합Vulkan 프로젝트를 CMake로 빌드하려면 Vulkan SDK와 라이브러리를 설정하고, CMake에서 이를 올바르게 찾고 링크해야 합니다. Vulkan은 플랫폼에 따라 설치 방법이 다를 수 있으므로, 개발 환경에 맞게 설정해야 합니다.Vulkan SDK 설치Windows: LunarG에서 제공하는 Vulkan SDK를 설치합니다.LunarG Vulkan SD..
이전 글에서는 러스트의 트레이트(Trait)와 제네릭(Generic) 개념을 통해 추상화와 다형성을 어떻게 안전하고 명확하게 달성하는지 살펴보았습니다. 이번에는 러스트에서 에러를 처리하는 방식을 알아봅시다. C++에서 예외(Exceptions)를 던지고 try/catch로 받는 패턴에 익숙하다면, 러스트가 보여주는 접근 방식은 다소 낯설게 느껴질 수 있습니다. 러스트는 기본적으로 예외(throw)와 catch 블록이 없습니다. 대신 함수의 반환값을 통해 에러 상황을 명시적으로 처리하는 Result 타입, 값이 존재하지 않을 수도 있음을 표현하는 Option 타입, 그리고 프로그램이 더 이상 진행할 수 없는 치명적 상황에서 사용하는 panic! 매크로로 구성된 에러 처리 철학을 가지고 있습니다.런타임 예외..