Study(3)
-
OpenCL에서 효율적인 행렬곱(matrix multiplication) 수행
행렬 A: M x K 행렬 B: K x N 행렬 C: M x N 이 글에서는 OpenCL에서 $C = A \times B$를 효율적으로 계산하는 방법에 대한 내용을 다룬다. 총 4가지 버전의 구현이 있으며 설명 순서대로 incrementally 성능이 개선된다. 이 글은 https://cnugteren.github.io/tutorial/pages/page1.html의 많은 내용을 참고해서 작성 되었다. (이 글에서 사용한 행렬곱을 시각화한 그림은 모두 위의 링크에서 가져왔다.) OpenCL 없는 구현 1. naive version 가장 일반적으로 생각 해낼 수 있는 행렬곱 구현이다. for (int i=0; i
2020.05.10 -
C와 Python에서의 음수 나눗셈에 관하여
C에서는 -7 / 3 == -2이고, -7 % 3 == -1이다. 반면 Python에서는 -7 // 3 == -3이고, -7 % 3 == 2이다. 일반적으로 대수에서는 유클리드 나눗셈(Python 방식)을 따르는데, C와 Python에서 각기 다른 연산 방식을 따르는 이유가 궁금해졌다. C와 같이 나눗셈을 구현하려면 다음과 같은 추가적인 과정을 거쳐야한다. (둘 중 하나) shift right 연산 이후에 shift 되어 사라진 부분에 1이 하나라도 있으면 shift 이후의 결과값에 1을 더한다. shift right k 연산(>> k) 이전에 k개 자리만큼 1을 더해준다. Python에서는 아무래도 Python 용도의 특성상 modulo 연산을 대수에서 사용하는 것과 동일하게 구현을 한 것 같다. 반면..
2020.05.05 -
AVX (Advanced Vector Extensions)의 개념과 사용법
2008년 인텔은 AVX (Advanced Vector Extensions)라는 새로운 고성능 ISA를 발표한다. 이는 기존의 SSE (Streaming SIMD Extensions)에 포함된 많은 operation들을 지원함과 동시에 더 빠른 속도로 더 큰 덩어리(chunk)의 데이터를 처리할 수 있는 혁신적인 기술이었다. 이 글에서는 intrinsic functions라고 불리는 특별한 C 함수들을 통해서 어떻게 AVX, AVX2를 이용할 수 있는지에 대해서 다룰 것이다. AVX 명령은 mov, add와 같이 어셈블리 명령어에 해당한다. 예를 들어 vaddps라는 AVX 명령은 두 operand를 더해서 그 결과를 세번째 레지스터에 저장한다. 그렇다면 AVX 명령을 사용하기 위해선 어셈블리어로 코딩을..
2020.04.07