전체 글

전체 글

    Thread Hierarchy, CUDA Kernel

    💡 Thread Hierarchy 커널 함수가 호스트에서 호출될 때, 많은 수의 스레드가 생성됨 스레드 계층 구조는 스레드 블록과 그리드로 구성됨 어떤 스레드가 어떤 데이터를 처리할지 인덱싱을 해주는게 프로그래머가 해야할 역할임 그리드와 스레드 블록의 크기는 두 개의 built-in 변수를 이용하여 구할 수 있음 gridDim:그리드 크기(그리드 내의 블록의 수), gridDim.x, gridDim.y, grindDim.z blockDim: 블록의 크기(블록 내의 스레드의 수), blockDim.x, blockDim.y, blockDim.z blockIdx: 그리드 내에서 블록 인덱스 threadIdx: 블록 내에서 스레드 인덱스 데이터의 개수=스레드의 개수= 블록의 크기 * 그리드의 크기 나누어 떨어지..

    GPU Architecture, CUDA Compiler

    💡 계층 용어 SM(Stream Processor): GPU의 코어 Single Precision: 4byte로 표시되는 데이터 Double Precision: 8byte로 표시되는 데이터 커널: CPU에서 GPU로 보내는 부분의 단위, 커널 안에 그리드가 들어있음 그리드: 여러 개의 블록으로 이루어짐 블록: 여러 개의 스레드로 이루어짐 스레드: 공유 메모리 통해 데이터 공유, 블록 내에서 실행 동기화 커널이 실행되면 SM에 스레드 블록이 분배되어 실행됨 하나의 SM에 여러 블록이 대응됨 블록 수는 코어의 개수보다 많아야 함(블록 수 > 코어 개수) 스레드를 코어에 할당할 때 워프 단위라는 것을 통해 스케줄링을 해서 모든 스레드가 수행되도록 함 1 Warp = 32 Threads 💡 nvcc CUDA C..

    CUDA, 병렬 프로그래밍

    💡CUDA CUDA(Computed /unified Device Architecture)는 NVIDIA에서 개발한 GPU 개발 툴로 고성능 환경과 GPU 가속기 환경을 위한 개발 툴이다. CUDA는 CPU가 계산을 하는 부분에서 특정 영역을 GPU 가속기에 할당해서 가속기 쪽에서 처리를 해주는 모델로 구성돼있다. NVIDIA에서 생산한 GPU 제품군에서만 사용이 가능하다. 일반적으로 Serial 코드에서는 어떤 계산을 수행할 때 코어 하나가 순차적으로 프로그램의 순서에 따라서 계산을 수행하지만, CUDA같은 경우에는 CPU쪽에서 계산을 하다가 중간에 루프나 hostpot 같은 부분을 할당 받아서 독립적으로 수행하고 그 결과 값을 return해주는 구조로 계산이 진행된다. 💡Heterogeneous Sys..

    스프링부트 구조 Controller, Service, DAO, Repository, DTO, Entity

    스프링부트의 구조와 요청 흐름은 이러하다. 위 사진처럼 회사나 개발 그룹 규정에 따라 서비스와 DAO 사이에서 엔티티로 데이터를 전달하는 것을, 아래 사진처럼 DTO로 전달하기도 한다 💡 Controller 컨트롤러는 클라이언트로부터 요청을 받고 해당 요청에 대해 서비스 레이어에 구현된 적절한 메소드를 호출해서 결괏값을 받는다. 클라이언트로부터 들어오는 HTTP 요청을 받아서 처리하고, 그에 따른 결과를 HTTP 응답으로 반환하는 역할을 한다. @RestController @RequestMapping("/product") public class ProductController { private final ProductService productService; @Autowired public Product..

    엔티티 매니저? 영속성 컨텍스트?

    💡 엔티티 매니저 팩토리 엔티티 매니저 팩토리는 엔티티 매니저를 만드는 공장이다. 공장을 만드는 비용이 크기 때문에 애플리케이션 전체에 1개만 만들어서 공유하도록 설계되어 있다. 다음은 엔티티 매니저 팩토리를 생성하는 코드다. EntityManagerFactory = Persistence.createEntityManagerFactory("jpabook"); 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 다른 스레드 간에 공유해도 된다 💡 엔티티 매니저 엔티티 매니저는 엔티티를 관리하는 관리자로 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. 다음은 엔티티 매니저를 생성하는 코드다. EntityManager em = emf.createEntity..

    JPA? ORM? 하이버네이트?

    💡 ORM 등장 배경 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 이로 인해 객체 모델과 관계형 모델 간에 불일치가 존재한다. 객체 모델과 관계형 모델 간의 불일치 사이에서 개발자는 SQL문을 사용하여 두 모델 간의 차이를 메웠지만 객체 모델링을 SQL로 풀어내는데 너무 많은 코드와 노력이 필요하다. 이러한 문제를 해결하기 위해 ORM이 등장하였다. 💡 ORM이란 ORM은 Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제와 제약사항을 개발자 대신 해결해준다. 💡 JPA JPA는 Java Persistence API의 약자로 자바 ORM 기술에 대..

    MVC

    💡MVC 패턴이란 MVC는 소프트웨어를 Model, View, Controller라는 3가지 구성 요소로 구분한 개발 방법론으로 사용자 인터페이스, 데이터 및 논리 제어를 구현하기 위해 사용되는 디자인 패턴이다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두며 이를 통해 더 나은 업무의 분리와 향상된 관리를 제공한다. MVC 웹 프레임워크를 사용하는 대표적인 프레임워크는 스프링, 장고 등이 있다. 💡Model Model은 소프트웨어나 애플리케이션에서 정보 및 데이터 부분을 의미한다. 이는 Controller에게 받은 데이터를 가공하는 역할을 수행한다고 볼 수 있다. 💡View View는 입력값이나 체크박스 등과 같은 사용자 인터페이스 요소를 나타낸다. 이는 Controller에게 받은 Mode..

    REST API

    💡REST란? REST는 Representational State Transfer의 약자로 자원에 이름을 규정하여 행당 자원의 상태를 주고받는 것을 의미한다. 즉 REST란 HTTP URI를 통해 자원에 이름을 규정하고 HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다 CRUD Operaion Create : 데이터 생성(POST) Read : 데이터 조회(GET) Update : 데이터 수정(PUT, PATCH) Delete : 데이터 삭제(DELETE) 💡REST의 특징 유니폼 인터페이스 어떤 프로그래밍 언어인지 상관없이 플랫폼 및 기술에 종속되지 않고 타 언어, 플랫폼, 기술 등과 호..

    레이어드 아키텍처

    💡레이어드 아키텍처 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미한다. 레이어드 아키텍처는 어떻게 설계하느냐에 따라 용어와 계층의 수가 달라진다. 💡프레젠테이션 계층 애플리케이션의 최상단 계층으로, 클라이언트의 요청을 해석하고 응답하는 접점 역할 UI나 API를 제공 프레젠테이션 계층은 별도의 비즈니스 로직을 포함하고 있지 않으므로 비즈니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할만 수행한다 상황에 따라 유저 인터페이스(UI) 계층이라고도 한다 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할 💡비즈니스 계층 애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할을 수행한다..

    관점 지향 프로그래밍(Aspect Oriented Programming, AOP)

    💡관점 지향 프로그래밍 등장 배경 프로그래밍을 하다보면 공통적인 기능이 많이 발생하는데 이러한 공통 기능을 모든 모듈에 적용하기 위해선 상속을 이용한다. 하지만 Java에서는 다중 상속이 불가능하며 상속만으로 공통 기능을 부여하기에는 한계가 있다. 예를 들어, 객체마다 핵심 기능을 수행하기 위한 로직과 함께 로깅, 트랜잭션 등의 코드가 있는데 로깅과 트랜잭션 코드는 객체마다 동일한 기능을 수행할 확률이 높고 동일한 코드가 각각의 객체에 포함될 수 있다. 💡 이러한 문제를 해결하기 위해 AOP를 사용한다. AOP는 관점을 기준으로 개발하는 방식을 의미하며 여기서 관점이란 어떤 기능을 구현할 때 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다 💡 핵심 기능은 비스니스 로직..

    제어 역전(Inversion of Control, IoC)과 의존성 주입(Dependency Injection, DI)

    💡제어 역전(IoC) 스프링 프레임워크 없이 개발할 때는 객체의 생성, 설정, 초기화, 메소드 호출, 소멸 등 객체의 생명 주기 관리를 개발자가 직접 관리하지만 스프링 프레임워크를 사용하면 객체의 생명 주기를 스프링 컨테이너, IoC 컨테이너에 위임할 수 있다. 이렇듯 객체의 관리를 개발자가 직접 하지 않고 컨테이너에 맡겨서 외부로 제어권을 위임한 것을 제어 역전이라고 부른다 객체의 생명 주기를 프레임워크에 위임하면 외부 라이브러리가 프로그래머가 작성한 코드를 호출하고 흐름을 제어할 수 있게 된다. 이렇게 되면 개발자는 비즈니스 로직을 작성하는 데에 더 집중 할 수 있다. 💡의존성 주입(DI) 의존성 주입이란 제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 ..

    [개발 블로그는 어떻게 써야할까?]를 읽고

    블로그는 남들에게 지식을 전달하는 매체이기 때문에 개인 공부 노트처럼 쓰면 안된다 개인 공부 노트처럼 사용하려면 노션이나 노트같은 개인적인 공간에 어울림 단순한 클래스 사용법 다른 블로그에서 본 내용을 재정리 책에 나온 개념을 옮겨 적기 등의 글은 열심히 했다는 평가를 받을 수는 있지만 잘한다는 평가를 받기는 어려움 더보기 생각해보니 나도 블로그 초반과는 다르게 현재 복학을 준비하는 시점에서 준비할 것도 많다고 느껴지고 시간도 부족하고 귀찮다는 이유로 이런 식으로 블로그를 쓰려고 했다는걸 느낌 개념 정리를 하더라도 깊게해서 아무나 쓸 수 없는 글을 만들고 나의 기술력도 향상 시키자 ex) 단순 개념 정리 및 소개 x, 개념을 이해하기 위한 장단점 및 비교 분석 글자만 있는 글보다는 글의 가독성을 높이기 ..