참고글(https://www.facebook.com/permalink.php?story_fbid=3848005078583271&id=100001214517957)
예전에 SIMD가지고 간단한 MLP 최적화를 쪼물락거린적이 있는데...SIMD 최적화 노가다를 해보니 딱 드는 생각이 아.. 이거 메모리 사이드에서 해줘야 될 것 같은데였다.
삼전 다니는 친구한테 야 내 아이디어 죽이지 하니까 이미 그런거 만들고 있고 엊그제도 강의 들었다고 한다. 아.. 이미 .. 나보다 100년 앞서 생각했구나.. 그럼 그렇지. 내가 코인으로 꼴고, 그저 무명 월급충인데는 이유가 있다.
여튼 링크로 공유한 글이 그런 느낌인데 정확히 이해하지는 못해도 그런 메모리는 필연적으로 등장할 것이다.
예컨데 대용량 벡터 연산 노가다를 최적화한다고 낑낑거리고 있으면 딱 보이는 것이다. 여기서부터 여기까지 전부 두 줄 곱셈 후 덧셈해 줘(FMA 명령어 셋트). 이게 진짜 많다. 이 벡터랑 저 벡터랑 줄줄이 각각 곱셈한 후 다 더해.
아... 이것은 흡사 마이컴이나 AP에서 하던 DMA 복사 아닌가?
예를 들어 메모리 복사는 이렇다.
for n { copy }
CPU는 n회 뺑이치고, 캐시의 효과는 그저 버스 사용률 감소 뿐이 없는데 그마저 뺑이가 계속되니 버스는 가득 쓴다. 전기도 쓰고 CPU도 쓰고 버스는 바쁘다.
DMA 복사는 이렇다.
DMA복사! 시작주소, 끝주소, 목표 주소
복사는 DMA 모듈이 알아서 하고 복사가 끝나면 인터럽트로 받는다. CPU는 DMA 명령어를 DMA 모듈에 1번 보내고 끝이다. 인텔이라면 아마도 노스브릿지 이하 버스만 바쁘고 CPU쪽 버스는 놀 것 같다. CPU도 놀고. 캐시도 안 깨지고. 뭐 대충 20대 남성 오세훈 지지율의 구글플렉스승 만큼 빠름.
어.. 그러고보니 벡터간 연산은 시작-끝으로 퉁칠 수 없는데 예컨데 행결 계산은 nXm 형태라고.. 어.. 그러면 이거 2D 그래픽 가속기에 나오던 비트블릿 DMA 잖아???
명령어는 대충 이렇다.
2D복사! 시작주소, 폭, 높이, 목표주소
그렇다면 이걸 메모리에 아예 때려박음 어찌되나. 아니면 아쉬운대로 노스브릿지에 넣는다면. (이미 들어있나?? 나는 모른다)
낸드처럼 커맨드 채널이 들어가고, 작은 sram에 바이트 코드를 다운로드 할 수 있다. 바이트 코드는 각각 커맨드 번호를 부여받는다. (FPGA 타입은 오바라고 보고..) 물론 많이 쓰는 연산은 이미 프리셋으로 제공된다.
각 바이트코드는 대충 이런 형태가 될 것이다.
이제 실제 바이트 코드는 이렇게 다운로드 된다.
cmd1 : w, h, uint32, A + B
바이트 코드는 이렇게 사용한다.
메모리야 실행해(cmd1, 0x1번지, 0x1000번지, 가로10, 세로10, 콜백함수는 CCC)
이제 메모리는 1번지와 1000번지에서 각각 10X10의 행렬 덧셈을 실행한 후, 인터럽트를 발생시킨다. OS의 인터럽트 핸들러가 받아서 함수포인터 벡터테이블을 보고 아 이거 CCC꺼네 하고 CCC를 호출한다.
비동기구간의 남는 시간동안 복잡한 일을 처리할 수도 있겠지만 겁나 빠를 것이므로 그냥 비동기 대기를 인터럽티블로 수행하면 된다. 다른 놈들이 컨텍스트 스위칭으로 CPU 뽑아먹고 있을테니까 괜찮을 것 같다.
이렇게 하면 인공지능 연산의 상당 부분을 메모리 사이드에서 실행할 수 있다. 학습도 추론도 오케이다.
줄줄이 상상도를 썼는데..
...아마 벌써 시제품이고 뭐고 있을 것 같다..
.... 약 10분후 예언 = 이미 다 완성된 개념이랩니다... 이 글 내립니다....