2014년 의례가 들어와서 Reverse engineering 을 했었습니다.  


기존 제품을 분석하는 작업입니다.

제품 용도는 콘크리트 두께를 측정하는 장치 입니다. 공사에서 아스팔트 두께가 일정 미만이면 안되기때문에 이것을 측정기를사용하여 두께를 측정합니다. 



기존의 두께 측정기 입니다. Reverse engineering 이유는 단가 및 공급문제가 있었기때문이였던것 같습니다. 


초음파를 쏴서 56us에 캘리브레이션 하는 작업이 필요합니다. 

오차 범위안에 들어오면 계측기를 사용할 수 있게 됩니다.



제품을 분해하고, 원가를 대략 잡고 프로그램 동작 시퀀스를 분석하였습니다.

MCU는 Atmera128A 시리즈이고, 인터럽트, 카운터 IO 가 사용되었습니다. 

전원부는 스위칭 파워가 사용되었고, 전원은 9V 입니다. 

초음파에 들어오는 Amp가 있고, 신호를 보내는용도의 트랜스가 있습니다.


카운터 발생 주기 입니다. 리시브에서 증폭되는 피크가 MCU 에 카운팅되게 됩니다.


동일하게 동작되는 기능에 대해  FW를 개발하여 용돈벌이가 되었습니다. 


지금 생각해보면 수요만 있다면, 소형디바이스 + 스마트폰 + 데이터 통계  이렇게 조합하는것도 괜찬지 않을까 생각이 드네요. 


By. 평생개발자 였습니다. 







'취미' 카테고리의 다른 글

Xiaomi A1 액정 수리 후기  (0) 2018.12.28
Multi touch monitor  (0) 2018.09.20

몇달만에 포스팅 합니다 .ㅎㅎ


블로그 쓰려고 자료를 모아두는데 일이 많아서 관리못하구 있었습니다. ㅜㅜ


몇달 전 출장 중 휴대폰 액정이 파손되었습니다. 하~  차에서 내리는 순간 툭 하고 휴대폰이 빠져서 콘크리트 바닥에 직행 해버렸네요.  단숨에 박살 났습니다. 심지어 깨지고 구멍나버렸네요. ㅜㅜ 당장 10일 후에 배트남 출장가야하는데 폰이 박살 나다니...

Xiaomi 제품도 잘 쓰고 있었기에 Xiaomi mi8 기기를 구매하고 다행이도 출장 전 제품을 받을 수 있었습니다. 시간 날때 mi8에 대해서 리뷰를 쓰는것도 괜찬을것 같아요. ㅎㅎ




본론으로 들어가 출장 후 도착한 패널 수리 후기 입니다. 


원래는 자가수리를 하려고 하지 않았었습니다.  급하게 휴대폰을 수리를 해야하는데 국내 수리대행 업체에 문의결과 재생품은 5~6만, 새재품은 8만원까지도 부르더군요 ㅜㅜ

https://ko.aliexpress.com/item/AAA-Quality-LCD-Frame-A1-LCD-Display-5X-A1-LCD/32842003488.html?spm=a2g0s.9042311.0.0.3da24c4dLLIDTS

2.7만 정도면 부품을 구입할 수 있기에 업체 수리를 포기하고, 다른 휴대폰을 하나 더 샀습니다. ㅋㅋ



수리 킷트를 사면 기본적으로 제공되는 도구 입니다. 이것만 있으면 다른 도구 없이 분해 & 조립을 하실 수 있습니다. 


유심카드를 분리한 상태에서 힘으로 분해하려 하지 말고, 도구를 사용하여 톡톡 분해하셔야 합니다. 



사이 공간을 벌려주면서 도구를 사용하여 들어 올려 줌니다.




메인보드 분리


배터리 분리

흰 스티커를 살살 당져주면 배터리와 접착면이 떨어지게 됩니다. 이거 참 잘만들었네요. 배터리 수리를 용이하게 만들었습니다.


작은 부품 하나하나 빠짐 없이 새로운 패널에 옮겨줌니다.







짜잔~~ 










'취미' 카테고리의 다른 글

초음파 두께 측정기  (0) 2018.12.29
Multi touch monitor  (0) 2018.09.20



예전에 마이너리티 리포트느낌의 제스쳐 감지 포스팅에 포함된 내용 입니다. 




2010년도 가구 디자인 수업 때 저는 터치 모니터를 만들었습니다.  ㅋ


그 당시 터치모니터를 만들어서 뭔가 표현을 하고 싶었습니다. 







3D Max 를 사용하여 터치 모니터 디자인을 하고, MDF 판넬을 어떤 크기로 재단을 해야할지 계획을 세웠습니다. 



전형적인 공대생이 마음것 도구들을 활용할 수 있었던 이 공간(계원예술대학교)이 많이 그립네요.  



LCD 패널 뒤에 카메라가 설치되어야 하기때문에 뒷 부분이 이렇게 거대할 수 밖에 없었습니다. MDF를 사용한 첫 작품이기때문에 멋진 퀄리티를 내진 못했네요 



전시회 출품되었습니다. ㅎ











지금 생각해보면 오래된 기술이고, 2010년도에도 오래된 기술 이였는데 오픈 소스로 잘 가져다가 만들었었네요.  ㅎㅎ




'취미' 카테고리의 다른 글

초음파 두께 측정기  (0) 2018.12.29
Xiaomi A1 액정 수리 후기  (0) 2018.12.28

 벌서 다섯번째 포스팅 입니다. 

기구적으로 어느정도 5축 까지는 완성되었는데 마지막 축을 결정하는데는 좀 더 시간이 걸릴것 같으므로, 제어를 시작 했습니다. 

 

시작한지 1~2주만에 제어부를 완성 했습니다. 예정에 "2-wheel Balance robot" 만든 경험으로 시행착오 없이 금방 만들었어요~

 

오늘까지 완성된 로봇팔 입니다. 

오른쪽에 있는 빨간 버튼은 긴급정지 버튼 입니다. 좌표를 잘못 설정 했다면 빠른속도로 정지해야겠죠?

PID 제어를 사용해서 속도와 각도를 제어하고, 모터에 대한 피드백을 지속적으로 받을 수 있습니다.

 

 

목표 지점까지 이동하는 영상입니다. 

 

 

약 10mm 를 1000단계의 분해능으로 20초간 움직이는 영상입니다.

 

 

 

 

 

 

 

이제 개선 과정을 볼까요? 

 

 

5DOF 구성 사진 입니다.  끝 부분이 완성되면 6축이 됩니다.

 

 

 

배선 정리 입니다. 26개의 선을 하나하나 이어 붙입니다. 엔코더 선과 모터 선이 일치하도록 끝마킹을 합니다.(다시 풀지 않으려면 ㅋ)

 

 

 

 

배선 정리 후 모터 전류제어 보드를 연결합니다. 좌측 보드로 테스트해봤었는데 모터 순간 전류에 빠르게 발열이 올라가서 사용 못 하고, 10A 짜리 보드로 교체했습니다.

 

그리고 엔코더 펄스도 확인하다가 6개 모터 중 1개 모터가 엔코더 카운팅이 이상해서 체크 해보니 Hall Sensor 와 자성 축 센서 간의 거리가 멀어서 AB 신호 구분이 명확하지 않은 문제를 조정하였습니다.

 

 

이제 MCU 를 사용해서 PID 제어 알고리즘을 넣었습니다.  모터를 모델링할 수는 없어서 빠른 속도로 Goal Position에 안정적으로 도달될 수 있도록 상수 값 비례(Proportional),

적분(Integrator), 미분(Differential) 값을 적절히 조절하였습니다.

 

모터 조정 간격(Sampling)은 14khz 입니다. 예전에 밸런스 로봇에 적용 했을때는  200hz으로 오차 보정시간이 걸렸었는데 지금은 훨씬 빠른 속도로 보정됩니다.

 

 

그리고 하나의 Slave MCU는 3개의 모터를 제어하고 MCU 는 2개의 Slave를 제어합니다.

 

 

 

  

MCU 셋팅하는 모습입니다. 클럭을 맞추려면 데이터시트를 참고 해야하는데(AVR 당시..), 

이 프로그램을 사용하면 자동으로 셋팅 됩니다.ㅋㅋ

 

 

그리고 오랜만에 MPU 개발하니까 재미있었네요 ㅋㅋ 

AVR 당시에는 예전에 개발한 코드를 참고하면서 개발 했었는데 

지금은 STM32CubeMX 라는 ST 에서 제공하는 툴을 사용하여 초기셋팅을 했는데 많이 편리합니다.

 

 

 

브래드보드에서 동작 확인 후 만능기판에 작업을 합니다.  (소요시간은 3시간) 

정상 동작하는하는걸 보니 아직 실력이 죽지 않은것 같습니다. 

 

 

 

모터 1회전 분해능은 22660이며, 1~3관절부 1회전은 185738 이 됩니다. 4~6관절부 1회전은 133731 됨니다.  

 

각 관절 해상력은 충분히 나올 수 있도록 설계되었기때문에  0.1mm 정밀도가 나올것이라 기대하고 있습니다. (감속기어 백레쉬가 커서 반복정밀도는 안나오겟지만요. ㅜ)

 

이제 역기구설계를 통해서 카테시안좌표로 모든 관절이 움직입니다.

 

다음 포스팅에서는 소프트웨어를 통해서 로봇 시뮬레이션하는 과정을 보여드리고자 합니다. 

1. 로봇 캘리브레이션 하기 (엔코더 위치값 초기화)

2. 원하는 좌표로 이동하기 

3. 카메라를 사용하여 로봇과 월드좌표계 캘리브레이션후 마커 인식포인트로 이동

 

3가지 목표 입니다.  ㅋㅋ

 

 

1,2 을 얼른 끝내고  3번 영상처리를 시작하고 싶습니다. 전공 살리기 힘드네요 ㅋㅋㅋㅋㅋ

 

 

 

 

 

1920x1080 60fps USB3.0 카메라 입니다. 영상처리를 해보니 디코더가 내장되어 있어서 손실압축을 하는것 같네요. 

고품질 영상을 얻을 수는 없겠지만, 정지영상에서 물체를 식별할 수는 있습니다. 

 

카메라 케이스 제작하여 알루미눔 프로파일에 장착을 합니다.

 

 

짜잔~

lidar는 Slam에 사용하려고 잠깐 테스트 했었는데, 성능 테스트겸 집을 대상으로 위치를 추정해보려 합니다. 

 

 

 



 

 

 

각 위치로 이동하는 테스트 입니다. 

 

 

 

3D Printer 로봇팔 제작 - 6 편을 기대해 주세요~ 

 

 

'취미 > 3D Printer 로봇팔' 카테고리의 다른 글

3D Printer 로봇팔 제작 - 7  (0) 2019.07.18
3D Printer 로봇팔 제작 - 6 (SW 설계)  (0) 2019.04.06
3D Printer 로봇팔 제작 - 4  (3) 2018.05.05
3D Printer 로봇팔 제작 - 3  (1) 2018.02.05
3D Printer 로봇팔 제작 - 2  (0) 2017.11.12

상용화된 전지는 리튬이온, 폴리머 , 리튬 인산철 정도로만 알고 있었는데 , LTO를 알면서

리튬 배터리를 보는 눈이 좀 더 달라졌습니다. 


최근 LTO 배터리에 대한 관심이 높아져서 배터리에 대한 정보를 잠시 수집했습니다.


음극, 양극, 전해액, 분리막 소재를 어떤 것으로 사용하느냐에 따라서 배터리 수명과 방전율, 배터리 밀도가 결정되겠습니다. 


LTO배터리는 에너지 밀도가 적어서 스마트폰에 사용하기는 힘들 수 있겠습니다.  아마도 적용된다면 급속 충전이 되는 휴대폰이 되겠군요. 

제 생각에는~ 방전율 차이는 있겠지만 슈퍼콘덴서의 자리를 LTO가 할 수 있지 않을까 싶습니다.


음극재


참고 : http://slideplayer.com/slide/5807817/


참고 : http://slideplayer.com/slide/4877973/#



정리가 잘되어 있는 자료가 있어서 내용 참조 합니다. 



양극재

Lithium Cobalt Oxide(LCO)

 -

Lithium Nickel Manganese Spinel(LNMO)

 -

lithium Nickel Manganese Cobalt Oxide(NCM)

 -

Lithium Nickel Cobalt Aluminum Oxide(NCA)

 -

Lithium Manganese Spinel(LMO) 

 -

Lithium Ferro(Iron) Phosphate(LFP)

 - 리튬이온 배터리에 비해서 안전하다(하지만 용량이 좀 더 떨어짐),  동작 온도 범위가 넓고 방전율이 높아서  전동기 등에 유용하게 사용 될 수 있겠다. 

(음극제에 따라서 달라지겠습니다.)




음극재

Artificial graphite 인조흑연

 -

Natural graphite 천연흑연

 -

Low-crystallization carbon 저 결정탄소

 -

Metal Composite Material  금속 복합

 -

lithium titanium oxide LTO

 -




분리막

건식막

 -

습식막

 -

강화막

 -





정리

사용하려는 제품에 따라 배터리 특성을 분명하게 파악이 되어야합니다. 

모든 배터리가 고방전, 밀도, 수명이 길면 좋겠지만~~ 

현제는 모든 리튬배터리가 3가지는 만족하기는 어렵다고 보여집니다. 






수정중~~




'ETC' 카테고리의 다른 글

가변 파워서플라이 구매!  (0) 2017.11.12
취미 공간 변천사  (0) 2017.11.05
3D Printer 구매 후기  (0) 2017.11.04
TOF 레이저 측정기 구매!!  (0) 2017.11.04
mi box pro 직구 후기!!!  (1) 2016.12.25

 안녕하세요. 평생개발자입니다. 

정확히 3개월만에 로봇팔 제작 포스팅 한만큼 진도가 많이 나갔습니다. ㅎㅎ

3D Printer 로봇팔 제작 - 3 에서 큰 변화는 관절(Joint) 부분 입니다.  3D printer로 출력하여 경도가 낮아 뒤틀림 현상이 가장 큰 골치거리 였습니다.  

 

 이번 포스팅에서는 좀 더 로봇 팔 처럼 뼈대를 단단히 잡고 각 관절을 움직일 수 있도록 하여 

다음 3D Printer 로봇팔 제작 - 5 에서는 기구파트 부분을 마무리 예정입니다. 

 

 

 

 

 

 

  

초기 관절 버전에서는 3D Printer 출력물이 기준으로 축을 잡고 있었습니다. 하지만 문제가 발생 되었던 부분은  로봇팔이 6축으로 움직이고 회전이 발생될때 축 자체가 뒤틀리는 현상으로 관절이 버텨내지 못했습니다. 

왼쪽 사진의 개선 된 방식으로 모든 관절이 동일한 형태로 모듈화를 하였고, 

베어링과 고정 축을 밀접하게 볼트로 잡아 줄 수 있는 구조로 문제를 해결 했습니다.

 

 

 

 

 

  

3D Printer Nozzle size 가 0.4mm 로 층 쌓는데 수치를 실 크기로 잡으면 볼트가 안들어가고, 베어링도 안들어 가더군요. 치수 설계시 +0.2mm 추가 했습니다. 내경에 들어갈때는 -0.2mm 

하나찍 출력해서 맞춰가는 작업이 시간이 많이 걸렸네요 ㅜㅜ

 

 

 

 

 

  

관절 모듈 제작과정 1

 

 

  

 

관절 모듈 제작과정 2

 

 

  

관절 모듈 제작과정 3

 

 

 

 

 

 

  

장력을 일정하게 유지하게 만드는 케이블 작업입니다. 

아이디어는 MTB 고급? 변속케이블에서 착안 했습니다.  

 

  

장력을 일정하게 유지한다는 말이 무슨말이냐면, 테프론 호수에 케이블을 넣어서 각 관절을 움직이게 됩니다. 문제는 장력이 높아지면, 테프론 호수가 견디지 못하고 길이가 줄어들게 되는 현상이 발생됩니다. 

그래서

테프론 호수가 줄어들지 못하도록 형태를 잡아주는 케이블 가이드를 만들었습니다.

 

 

 

모터 뭉치 그리고, 관절에 케이블을 연결하게 되는것 입니다. 

 

 

 

지금 까지~~~

 각 파트를 점검 했습니다. 

이제 로봇 뼈대를 고정할 바닥 부분과 6축 로봇 팔을 연결 하도록 하겠습니다. 

 

 

 

  

바닥 부분과 뼈대 조립 과정 1

 

   

  

바닥 부분과 뼈대 조립 과정 2

 

 

 

 

   

6축 로봇팔 뼈대가 완성된 형태 입니다. 

이제 로봇팔 형태가 이제 보이시나요???   

회사 야근하면서도 집에서 틈틈히... 틈틈히.. 만들었습니다.   ㅇ_ㅇ;;;

 

 

이제 각 모터를 관절에 연결하는 작업이 남아 있습니다. !!!

 

 

 

최대 이동 속도 입니다.  토크는 240kg/cm 이 되겠습니다. 

 

느린 속로도 2, 3번째 관절 이동 영상 입니다. 

아직 전자 제어가 들어가지 않아서 모터 속도가 일정하지 않은점을 감안하셔야 합니다. ㅋ

 

 

 

 

 

후~~~

 

여기까지 

3D Printer 로봇팔 제작 - 4 제작 포스팅을 마치겠습니다.

 

3D Printer 로봇팔 제작 - 5 을 기대해 주세요^^

 

 

 

 

 

3D Printer 출력 해보셨던 분은 이러한 현상 격으시면 정말 화가 나실꺼에요(8시간 짜리)..ㅋ

모터 탈조가 발생되어서 다 밀려버렸네요 ㅜㅜ 

나중에 close loop모터로 개조 해봐야겠습니다. ㅋ

 

 

 

 

 

 

 

'취미 > 3D Printer 로봇팔' 카테고리의 다른 글

3D Printer 로봇팔 제작 - 6 (SW 설계)  (0) 2019.04.06
3D Printer 로봇팔 제작 - 5  (1) 2018.06.09
3D Printer 로봇팔 제작 - 3  (1) 2018.02.05
3D Printer 로봇팔 제작 - 2  (0) 2017.11.12
3D Printer 로봇팔 제작 - 1  (0) 2017.11.12

컴퓨터를 설치하는데 책상 흔들림이 심해서 책상을 분석 해봤습니다. (나는 공대생이니까..)


흔들림 큰 원인은 얇은 책상 다리도 있겠지만, 아래 부분에 용접 부분이 떨어져 있었습니다. ㅜㅜ 냉땝이죠 

구매한지 얼마 안되어서 개조를 하려고 맘을 먹고 나무 판자를 대어서 고정할려고 하다가

 와이어가 생각 났습니다.  (로봇팔 실패작 에서 추출)



사진 처럼 와이어를 단단히 볼트 연결 부위에 고정하면 책상 흔들림이 잡을 수 있습니당


분노의 코딩을 해도 책상이 흔들리지 않게 되었습니다!! ㅋ

'ETC > 잡담' 카테고리의 다른 글

데스크탑 구매!!  (0) 2018.02.25

 여러분 드디어 컴퓨터를 구매 했습니다.


지금까지 조그만한 테블릿을 사용하면서 컴퓨팅 성능 부족함을 느끼지는 못했지만... 지금 막상 데스크탑을 쓰니까 너무 빠릅니다. ㅋㅋㅋ


뭐든 장비가 받춰줘야 하나 봅니다. 



PC 구매하려고 몇달 전부터 메모리 가격 좀 떨어져라 빌고 있었는데 오히려 더 오르고 말더군요... 메모리가 무슨.. 10만이 넘다니...


라이젠 CPU로 병렬처리 한번 스터디 해보고 싶었는데...     지금까지 머신비전 PC에서 AMD를 못봐왔어서 인텔로 가즈아~


이번에 구매한 레노버 PC 입니다. ~~ ㅎㅎㅎ

Y520T-25IKL 입죠..  


지금 가격보다 10만원 저렴하게 구매 했어요 ㅎㅎ 윈도우가격 까지 포함하니까 완성  PC가 더 저렴합니다. 


추가 PCI 슬릿이 없다는게 함정 ㅜㅜ  

3.5베이에 2TB 디스크 붙였습니다. ㅎㅎ 



 PC 작업 환경 입니다. ㅎㅎㅎ 




테블릿도 레노버 입니다. 모델은 miix 700~

지금까지 현혁을 만족하면서 쓰고 있었지만, 데스크탑처럼 집에서 쓰기에는 컴퓨팅 파워가 많이 부족 했습니다. ㅎㅎ  빌드 속도가 너무 느리더라구요 ㅜㅜ




더 빠른 컴퓨터도 샀고 열심히 하기만 하면 되겠네요... 게임이 아니라.. 공부를...

컴퓨터 주문할 당시에는 CUDA SDK 를 설치해야지 생각했지만,

당장 엘더스크롤5 받아서 설치해봤네요.ㅋㅋㅋ







'ETC > 잡담' 카테고리의 다른 글

흔들리는 책상 고정방법  (10) 2018.02.25

안녕하세요. 평생개발자 입니다.

 

 

S/W, H/W의 방향을 생각해봤습니다.

 

 

H/W는 단순 동작을 빠르고 명확하게 처리해줍니다. S/W는 H/W 자원을 사용하여 의미 있는 동작을 할 수 있도록 만들 어 주는 도구가 됩니다.

 

 

최선의 S/W 개발자는 제한된 H/W를 최소한으로 사용하여 최선의 결과를 도출하는 것이고,

H/W 개발자는 단순 동작을 더 빠르고 낮은 전력에 처리할 수 있느냐입니다.

 

 

 이제는 H/W에서도 S/W의 개념이 추가될 것입니다.!!

다시 말해서 CPU(central processing unit)에서도 고객에 맞춤식 F/W의 개념이 추가될 수 있을 것입니다.  사용자가 CORE 구조를 변경할 수 있다는 건 현재 구조에서는 불가능하겠지만 

 이러한 기술이 발전하기 위해서는  프로그래밍을 할 수 있는 로직 구조 즉 FPGA(field programmable gate array)이 CPU에 어떻게 녹아들 수 있는가가 문제라고 봅니다. 

 

즉!! 사용자가 CPU 명령어 셋을 입맛에 따라 만들 수 있다면, CPU(Overload)이 현저하게 줄어들 뿐만 아니라, 전력 소비도 잡을 것으로 예상합니다. 

 

최근에는 기계학습(머신러닝, 딥러닝)이 빠르게 발전하고 있기 때문에 CPU에서도 2019년도에서부터는 신경망 관련된 명령어 세트가 지원될 예정입니다.

 

앞으로

 

S/W 개발자의 길은?

 향후 H/W가 발전할 방향을 미리 알고 S/W에서 준비할 수 있다면 개발자로서 가치를 높일 수 있을 것 같습니다. 그래서 상위 레벨 개발보다는 하위 레벨을 계속 볼 줄 알아야 향후 미래 기술을 빠르게 접근할 수 있다는 결론입니다.!!

'컴퓨팅' 카테고리의 다른 글

SIMD와 4x4 Matrix 데이터 처리  (0) 2018.02.16
SIMD intrinsics header  (1) 2016.06.07
CPU 명령어 집합  (1) 2016.05.07

 안녕하세요. 평생개발자 입니다.


SIMD와 4x4 Matrix 데이터 처리에 대한 주관적인 의견입니다.



단일명령어 SISD(Single Instruction Single Data)로 구현된 알고리듬을 처리 속도를 높이기 위해 SIMD(Single Instruction Multiple Data) 자료구조를 변경하게 되었는데, 현재 구조는 Linked-list 구조로 자료형이 링크되어 있다 보니 데이터를 읽고 쓰려면 PC(Program count) 가 다시 찾아가는 문제가 있습니다.


수정 포인트!!

1단계 : Linked-list -> Array-list로 변경하는 구조로 수정작업이 필요 했고


2단계 : 3차원(X,Y,Z) 어떠한 자료구조를 가질것 인가?

 - 첫번째 구조

 X0

Y0 

Z0 

X1 

Y1 

Z1 

X2

Y2 

Z2 

... 

첫 번째 구조는 그래픽스(openGL, SDL,etc)하시는 분이라면 익숙하실 것 입니다. 3차원(3D)을 다루기 위해서는 [X, Y, Z]구조로 메모리에 담아두었다가 필요하면 Copy를 하기도 하고, 

openGL에 버퍼로 옮길 수 있는 구조 입니다.


여기서 요점은, [X, Y, Z]가 데이터를 처리 시간(Processing Time)을 단축할 수 있는 구조인가? 입니다.    


그래픽스에서는 3차원 데이터를 변형하기 위해서 4x4 Matrix 를 사용 합니다. 


여기서부터 최적의 연산(Computing)을 하기 앞어서 , CPU 종류를 결정되게 됩니다.

 

 저가 CPU는 SIMD 명령어(instruction set)이 존재하지 않습니다.  대표적으로 Intel 아톰, 셀러론 시리즈가 되겠습니다. 얘네들은 암호화 변복조에 필요한 AES(Advanced Encryption Standard) 정보만 포함되고, 연산에 필요한 레지스터는 없습니다. 즉,   SISD 연산만 가능하기 때문에 속도향상을 기대하기 어렵습니다. (동영상 플레이 하면 CPU 점유 상승)


SIMD 명령어가 포함된 Intel i3,i5,i7, 제온 등이 있습니다.  AMD는 애슬론, 비쉐라, 라이젠 등이 있는데,  저가 CPU에서도 SIMD 명령어 셋이 포함되어 있었습니다. 그래서 사람들이 인코딩 작업에는 AMD를 쓰라고 하는지? 느낌이었는지 궁금하군요.



 SISD 명령어는 [1] + [1] = [2] 하나씩 명령어를 처리하는 단일 연산자라고 생각하면 됩니다. 메모리에서부터 명령어 파이프라인 속도, CPU 병목현상에 따라서 속도가 결정되고, 일반적인 자료형으로 계산을 하였다면 SISD를 사용하고 있을 것입니다. 어쩌면 컴파일러가 지능적이라면 자동으로 수정할 지 의문!


 SIMD는 [1,2,3,4] + [1,2,3,4] = [2,4,6,8]  []묶음으로 한 번의 명령어로 데이터를 처리 할 수 있다.  

즉, SIMD는 묶음으로 한 번에 명령어를 처리함으로서 전체 명령어 수행 횟수를 줄일 수 있게 되어 속도 향상 효과를 가져다준다.  



SIMD 기대 효과에 대해서 이야기 드리겠습니다. 


 CPU 명령어 셋에는 크게 MMX, SSE, AVX, FMA 등 있습니다. (자세한 설명은 다음 포스팅에..)

각각의 레지스터들은  MMX = 64bit, SSE = 128bit, AVX = 256, AVX512 = 512bit 

데이터를 []묶을 수 있는 크기를 가지고 있습니다. 방금 언급한것 처럼 한 번에 데이터를 크게 묶을 수록 PC 수행 횟수가 줄어들기 때문에 속도 향상 효과를 가져다줍니다.


지금까지 서론 이였다면....    이제 본론으로 들어가겠습니다.

4x4 매트릭스가 어떠한 구조로 계산이 되는가? 이게 핵심 포인트 입니다.


SIMD 레지스터는 최대 512bit = flaot[16]를 묶을 수 있는데 어떻게 matrix에 담을 것인가? 

이 의문점에서는 두번째 구조를 확인하면 이해될 것이다. 


첫번째 구조에서 최적의 속도로 연산하는 방법은 SSE = float[4]  와 FMA 사용 할 것이다. 


Matrix SISD로 계산을 풀면

W' = (X*0 + Y*0 + Z*0 + 1 * 1 )               -> 8

 X' = (X*1 + Y*0 + Z*0 + 0 * 1 ) / W'         -> 9

 Y' = (X*0 + Y*1 + Z*0 + 0 * 1 ) / W'         -> 9

 Z' = (X*0 + Y*0 + Z*1 + 0 * 1 ) / W'         -> 9


Operand = 35



Matrix SIMD (SSE, FMA) (포스팅 예정)

E = A[X*0, Y*0, Z*0, 1 * 1 ] + B[X*1, Y*0, Z*0, 0 * 1 ] +

C[X*0, Y*1, Z*0, 0 * 1 ] + D[X*0, Y*0, Z*1, 0 * 1 ]       -> 6


X' = E[0] / E[3]    -> 2

Y' = E[1] / E[3]    -> 2

Z' = E[2] / E[3]    -> 2


Operand = 12



SIMD 를 사용하여 연산 수를 줄여 알고리듬 수행 속도를 높일 수 있게됩니다.


보통 openCV, Eigen, alglib 등등 matrix 관련된 라이브러리에서 SIMD 연산을 하고 있지만, Matrix 구조에 맞도록 넣어 주어야 합니다.




- 두번째 구조

 X0

X1 

X2 

X3 

X4 

X5 

X6 

X7 

X8 

... 


 Y0

Y1

Y2 

Y3 

Y4 

Y5 

Y6 

Y7 

Y8 

... 


 Z0

Z1 

Z2 

Z3 

Z4 

Z5 

Z6 

Z7 

Z8 

... 



첫번째 구조 SSE = float[4] 만 고려하였다면, 두 번째 구조에서는 avx512 = float[16]을 처리 할 수 있는 자료구조를 만들어서 데이터 처리 수행 시간을 크게 단축 할 수 있게 됩니다.


W' = (X*0 + Y*0 + Z*0 + 1 * 1 )               -> 8

 X' = (X*1 + Y*0 + Z*0 + 0 * 1 ) / W'         -> 9

 Y' = (X*0 + Y*1 + Z*0 + 0 * 1 ) / W'         -> 9

 Z' = (X*0 + Y*0 + Z*1 + 0 * 1 ) / W'         -> 9

기존의 SISD 형대의 자료형을 한 번에 16개를 처리한다고 생각하면 이해가 빠를것이라 생각 한다. 
즉, float[16] 를 한 번에 가지고 올 수 있는 구조 
x[x0, x1, ..., x15]
y[y0, y1, ..., y15]
z[z0, z1, ..., z15]
4x4 매트릭스도 16개가 있다고 생각하면 됩니다.

W[]' = (X[]*0[] + Y[]*0[] + Z[]*0[] + 1[] * 1[] )               -> 8

 X[]' = (X[]*1[] + Y[]*0[] + Z[]*0[] + 0[] * 1[] ) / W[]'         -> 9

 Y[]' = (X[]*0[] + Y[]*1[] + Z[]*0[] + 0[] * 1[]) / W[]'         -> 9

 Z[]' = (X[]*0[] + Y[]*0[] + Z[]*1[] + 0[] * 1[] ) / W[]'         -> 9


Array List인 이러한 구조를 통해서 명령어 처리 량이 16배 줄어든 것이다.  이러한 구조가 16배 속도 향상을 나타내는것은 아니며, 메모리 대역폭과 CPU레지스터의 성능에 따라서 좌우될것이라 생각 하고 있습니다. 



3단계 : SIMD 명령어를 지원하지 않을경우 예외처리.



다음 포스팅에서 좀 더 구체적이고 발전된 모습으로 정리하겠습니다. 


궁금한 사항은 문의 주세요. ^^

'컴퓨팅' 카테고리의 다른 글

향후 CPU가 발전할 방향?  (0) 2018.02.16
SIMD intrinsics header  (1) 2016.06.07
CPU 명령어 집합  (1) 2016.05.07

+ Recent posts