반응형
리눅스 환경에서 파일 백업과 패키징을 논할 때 tar는 빠지지 않고 등장하는 명령어입니다. 원래는 테이프 드라이브에 데이터를 모으기 위해 사용되던 도구지만, 현대 리눅스에서도 여전히 강력하고 유연한 아카이빙(archiving) 기능을 제공합니다. 이번 글에서는 tar를 다루기에 앞서, 그 기원과 필요성을 간단히 살펴본 뒤, 초심자가 이해하기 쉽도록 tar --help 출력을 기반으로 명령어의 기본 문법을 체계적으로 정리하겠습니다. 이후 기초 사용법에서 고급 활용 팁까지 예제를 통해 차근차근 알아보도록 하겠습니다.tar의 기원과 필요성tar는 "Tape ARchive"에서 유래한 이름으로, 과거 테이프 백업 장치에 여러 파일을 한 번에 저장하기 위해 만들어졌습니다. 현재는 테이프 대신 디스크나 네트워크를 ..
안녕하세요! 지난 1편에서는 PyTorch와 LibTorch에 대한 개념적인 소개와, 이 시리즈에서 우리가 달성하려는 궁극적인 목표를 알아보았습니다. 이제 실제로 C++ 환경에서 LibTorch를 활용하기 위한 기초 준비를 해볼 차례입니다.이번 글에서는 다음과 같은 과정을 다룹니다.LibTorch 다운로드 및 설치 위치 정하기: 운영체제(Windows, Linux, macOS)에 따라 설치하는 방법을 안내CMake 기반의 기본 프로젝트 환경 설정:CMakeLists.txt를 작성하는 방법LibTorch 라이브러리를 C++ 프로젝트에 연결하는 법간단한 “Hello LibTorch” 예제 코드를 통해 C++에서 LibTorch가 정상적으로 동작하는지 확인이 과정을 마치고 나면, 다음 글(3편)에서 텐서 생성..
안녕하세요! LibTorch 입문 시리즈에 오신 것을 환영합니다.이 시리즈에서는 머신러닝과 딥러닝에 널리 사용되는 PyTorch를 C++ 환경에서 다루는 방법을 차근차근 알려드리려 합니다. 많은 분들이 Python 환경에서 PyTorch를 사용하며 텐서(Tensor) 연산, 모델 훈련, 추론 등을 손쉽게 경험하셨을 텐데요, 여기서 한 발 더 나아가 C++ 환경에서도 PyTorch 기능을 활용한다면 무엇이 가능할까요? 또한, C++로 작성한 성능 높은 코드를 Python에서 투명하게 사용한다면 어떨까요?이 시리즈의 최종 목표는 C++로 작성된 수치 연산 및 딥러닝 로직을 PyTorch의 C++ 라이브러리(LibTorch) 로 활용하고, 여기에 pybind11을 이용하여 Python 환경에서도 동일한 로직을..
C++23에서는 범위(Range) 라이브러리를 더욱 강력하고 유연하게 만들기 위해 다양한 뷰(View) 어댑터가 추가되었습니다. 그중 하나인 std::views::stride는 입력 범위에서 일정한 간격으로 원소를 선택하여 부분 범위를 구성하는 뷰 어댑터입니다. 이를 통해 예를 들어 [1,2,3,4,5,6,7,8] 범위에서 stride(3)를 적용하면 [1,4,7]와 같이 매 3번째 원소를 추출할 수 있습니다. 이번 글에서는 std::views::stride의 개념과 사용법, 그리고 이전 방식과 비교하여 어떠한 개선점을 제공하는지 알아보겠습니다. std::views::stride란 무엇인가요?std::views::stride(n)는 입력 범위에서 시작 원소를 포함해 매 n번째 원소를 선택하는 뷰 어댑터입..
이번 글에서는 Python 바인딩 프로젝트를 CMake로 구성하고 설정하는 방법을 알아보겠습니다. C++로 작성된 라이브러리를 Python에서 사용할 수 있도록 바인딩하면 두 언어의 장점을 모두 활용할 수 있습니다. 이를 위해 다양한 라이브러리가 존재하며, 대표적으로 Boost.Python, pybind11, nanobind 등이 있습니다. 이 글에서는 특히 pybind11과 nanobind를 중심으로 설명하겠습니다.Python 바인딩이란?Python 바인딩은 C++로 구현된 코드를 Python에서 직접 호출할 수 있도록 연결해주는 기술입니다. 이를 통해 성능이 중요한 부분은 C++로 작성하고, 사용의 편의성은 Python으로 제공할 수 있습니다. 과학 계산, 게임 개발, 머신 러닝 등 다양한 분야에서 ..
이번 글에서는 지금까지 배운 스레드/블록/그리드 개념을 2차원 데이터에 적용하고, GPU의 비동기(Asynchronous) 기능을 살짝 맛보며 최적화를 향한 첫걸음을 내딛어보겠습니다. 이미지 처리나 행렬 연산 같은 2D 데이터 처리는 실제 GPU 활용 분야에서 매우 흔하고도 중요한 영역입니다. 또한 비동기 스트림을 활용하면 Host와 Device 사이의 작업을 겹치게 만들어 전체 처리 시간을 단축할 수 있다는 점을 알아볼 것입니다.2D 데이터 처리를 위한 블록/그리드 설정지금까지는 1차원 데이터(예: 벡터)에 대한 처리를 주로 다뤘습니다. 하지만 이미지(2D 배열)나 행렬을 다룬다면 2차원적으로 스레드와 블록을 배치하는 것이 직관적일 수 있습니다.2D 스레드 인덱스 계산 예제예를 들어, M x N 크기의..
지난 글에서 러스트의 소유권(Ownership), 빌림(Borrowing), 라이프타임(Lifetime) 개념을 살펴보았습니다. 이번에는 이러한 개념들을 실제로 활용해보는 실습 예제를 통해, 러스트의 컬렉션(Collection), 슬라이스(Slice), 그리고 함수형 프로그래밍 스타일을 지원하는 이터레이터(Iterator) 등을 다뤄보겠습니다. 또한 C++에서 std::vector, std::array, std::map 등을 사용하던 경험과 비교해보며, 러스트가 어떤 식으로 자료 구조를 제공하고 메모리 안전성을 유지하는지 살펴보겠습니다.벡터(Vector): 동적 크기 배열C++에서 std::vector로 동적 배열을 관리하던 것처럼, 러스트에서도 Vec 타입을 통해 크기가 가변적인 배열을 다룰 수 있습니..
안녕하세요! 지난 글에서 OpenCL 플랫폼과 디바이스 개념을 이해하고, 원하는 디바이스를 선택하는 방법까지 살펴봤습니다. 이제 본격적으로 커널(Kernel) 작성과 빌드 과정을 알아볼 차례예요. OpenCL 커널은 실제로 GPU나 CPU 등 디바이스에서 병렬 실행되는 코드로, 우리가 가속하고 싶은 연산의 핵심 부분이라고 할 수 있죠.이번 글에서는 다음 내용을 다룹니다.OpenCL 커널 기본 문법 소개호스트 코드에서 커널 빌드 방법 복습 및 확장인자 전달 및 메모리 관리 구조 이해CUDA 커널과 비교해 보는 코드 작성 차이점참고할만한 유튜브 자료 링크앞선 글에서 kernel.cl 파일 안에 간단한 add_one 커널을 작성해봤는데, 이번 글에서는 이보다 조금 더 다양한 형태의 커널 코드를 다뤄보면서 기본..
C++23에서는 표준 라이브러리에 std::spanstream 계열의 클래스 템플릿이 추가되어, 메모리 상의 연속 구역(spans)을 스트림처럼 다룰 수 있는 편리한 방법을 제공하게 되었습니다. 기존에 std::stringstream를 통해 문자열 기반 버퍼를 다루었다면, 이제는 std::span을 이용하여 메모리 버퍼를 입출력 스트림으로 다룰 수 있으며, 이를 통해 메모리에 이미 존재하는 데이터에 대해 스트림 연산을 간편히 적용할 수 있습니다. 이번 글에서는 std::spanstream, std::ispanstream, std::ospanstream의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 알아보겠습니다.std::spanstream란 무엇인가요?C++23에서 추가된 헤더에..
C++23에서는 범위(Range) 라이브러리를 풍성하게 하는 새로운 뷰(View) 어댑터들이 다양하게 추가되었습니다. 그중 하나가 바로 std::views::split_when 인데, 이 뷰 어댑터는 std::views::split와 유사한 역할을 하지만, 단순한 구분 문자나 구분 값이 아닌 **사용자 정의 조건자(predicate)**에 따라 범위를 동적으로 분할할 수 있습니다. 이를 통해 보다 유연하게 범위를 나누고, 특정 패턴이나 조건을 만족하는 지점마다 분리하는 로직을 간결하고 직관적으로 표현할 수 있습니다. 이번 글에서는 std::views::split_when의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 알아보겠습니다.std::views::split_when란 무엇인가..