2024년 2학기 멀티코어프로그래밍 수업을 듣고 정리한 내용입니다. 수업 교재는 Computer Architecture: A Quantitative Approach입니다.
OpenCL
병렬 처리용 프레임워크다. 역사나 개요 및 용어 정리에 대해선 다른 블로그를 참고하는 편이 나아 건너뛴다.
강의 목표
이번 강의에선 CNN을 사용하여 이미지 처리를 직접 구현하는 것이 목표다.
CIFAR10 데이터셋에 맞춰 변형된 VGG16모델의 각 레이어를 구현, 미리 준비된 3천장의 이미지를 전부 통과시키고 정해진 답안과 일치하는지 확인한다. 오차는 소숫점 셋째 자리까지 일치하면 정확하다고 판단한다.
이번 강의의 기말고사는 위 프로젝트로 대체되었다. 평가는 다음과 같이 진행되었다. 전체 처리에 걸린 시간을 측정하고, 이 결과에 따라 최종 평가를 진행했다.
VGG16
잘 정리가 되어 있는 블로그들이 많아서 설명은 건너뛴다.
본 프로젝트는 224x224크기의 이미지 스펙을 쓰지 않는 대신 CIFAR10 데이터셋을 사용하기 때문에 32x32부터 시작한다.
프로젝트 구조
강의에서 제공받았던 프로젝트 폴더 구조는 아래와 같았다.
.
|-- images.bin
|-- network.bin
|-- labels.bin
|-- right_output.txt
|-- cnn.h
|-- cnn_init.cpp
|-- cnn_opencl.cpp
|-- cnn_seq.cpp
|-- compare.cpp
`-- main.cpp
images.bin
에는 이미지 3천장, network.bin
에는 필터와 바이어스가 레이어순으로 저장되어 있다. labels.bin
에는 올바른 결과가 저장되어 있어서 정확도를 판단할 때 사용된다.
cnn_seq.cpp
에는 convolution, max pooing, fully connected레이어를 순차적으로 구현한 코드가 있다. 초기 상태에는 이 순차 코드를 실행하도록 되어 있는데, 내 컴퓨터에서 돌리니까 이미지 3천장을 처리하는데 30분 정도 걸렸다...
본 프로젝트는 cnn_init.cpp
와 cnn_opencl.cpp
에서 구현하도록 TODO 주석 블록이 있었다. 여기서 OpenCL을 사용하여 모델을 구현하고 실행한다면 최종적으로는 compare.cpp
에서 연산 결과의 정확도를 판단하고 올바르다면 Good
을, 라벨이 다르게 출력되었다면 정답 및 연산 결과를 함께 출력한다.
후기
프로젝트 구현 내용 및 최적화 전략은 다음 게시글에 상세히 적을 예정이다.
우리 팀은 1.82초까지 최적화에 성공했고, 전체 10팀중에서 6등을 했다. 전반적으로 최적화 결과가 1.4~1.6초 사이에 많이 분포했기 때문에 우리 팀도 더 최적화가 가능했을텐데 그렇게 못한 것이 아쉬웠다.
결과 발표를 듣다보면 대부분 같은 진행 방향을 갖고 최적화를 진행한다. 내가 인터넷에서 찾아봤던 여러 자료들 역시 다른 팀들도 참고한 자료라고 생각하면 되겠다. 그러므로 추상적으로 서술된 최적화 방법을 적용하는 것은 물론, 본인이 생각한 개선 방법을 팀원들에게 제시하고 다같이 검토해보는 것이 중요하다. 직접 결과를 측정해보고 개선이 되었다면 왜 개선이 되었는지, 개선이 안되었다고 하더라도 왜 개선이 안되었는지 생각해보는 점이 프로젝트 완성의 정도(正道)였던것 같다.
'대학교 공부 > 멀티코어프로그래밍' 카테고리의 다른 글
멀티코어프로그래밍 (5) - OpenCL 프로젝트 최적화 (0) | 2025.06.14 |
---|---|
멀티코어프로그래밍 (3) - [논문 리뷰] Extending Amdahl’s Law for Energy-Efficient Computing in the Many-Core Era (0) | 2025.06.14 |
멀티코어프로그래밍 (2) - Cache coherence (0) | 2025.06.14 |
멀티코어프로그래밍 (1) - 멀티코어 아키텍쳐의 대두 (0) | 2025.06.14 |
댓글