koodev

'전체 글'에 해당되는 글 75건

  1. ARM A64 명령어셋 ZIP1, ZIP2
  2. ARM A64 명령어세트 기본적인 내용 정리
  3. EIN and virtualenvwrapper

ARM A64 명령어셋 ZIP1, ZIP2

Programming

우선 ZIP1부터 정리한다. 이 명령어는 두 벡터에서, 즉 두 개의 SIMD/FP 레지스터에서 상위 절반(upper half)부분을 각각 떼어다가 뒤섞어(interleave) 붙인다. 설명보다는 그림으로 이해하는 것이 편할 듯.

ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>

위 그림에도 나와있듯이 ZIP2는 하위 절반 비트를 뒤섞는다.

뒤섞는 단위는 T파라미터에서 명시해 주는데, 8B, 16B, 4H, 8H, 2S, 4S, 2D 가 가능하다.

ARM A64 명령어세트 기본적인 내용 정리

Programming

ARM 명령어를 난생 처음 작성하다가 잘 안되어 기본적인 내용을 정리해본다. 이 내용은 Structure of the ARM A64 instruction set 에서 가져왔다.

레지스터

A64 아키텍쳐는 30개의 정수 레지스터가 있으며 각각은 x0부터 x31까지의 이름을 갖는다.

여기에 스택포인터 레지스터와 제로 레지스터가 있다. 제로 레지스터는 모든 비트가 0으로 고정된 레지스터이다. 그런데 이들 두개 모두 31번 레지스터 번호로 인코딩된다. 그리고 인스트럭션에 따라 스택포인터로 쓸지 제로레지스터로 사용할지가 결정된다.

30번 레지스터인 x30은 리턴주소를 저장하는데 사용된다.

여기서 이야기하는 레지스터들은 모두 길이가 64비트이다. 이들의 하위 32비트에 접근하는 용도로 w0에서 w31을 사용할 수 있다. 하위 비트에 쓰기 명령을 수행하면 상위 비트는 남아있게 될까? 그렇지는 않다. 하위 32비트에 쓰기 명령을 내리면 상위 32비트가 클리어된다.

부동소수점/벡터 레지스터

A64에는 위의 정수 레지스터와는 별개로 부동소수점이나 128비트 벡터 연산을 위한 32개의 레지스터가 존재한다. 이들은 벡터 연산을 지원하기 때문에 한꺼번에 64비트나 128비트씩 동작하도록 할 수 있다. 즉, 한번에 8비트 혹은 16비트, 32비트, 64비트씩 나누어 쓸 수 있다. 이렇게 하면 한번에 여러개의 동일한 연산을 수행시킬 수 있어서 코드 실행속도를 높일 수 있다. 원래는 루프를 돌면서 해야 할 일을 한꺼번에 수행하는 것이다.

명령어

명령어들은 ARM ARM for ARMv8-A 문서에서 설명되어 있다. 명령어 갯수는 앨리어스를 제외하고 442개 정도 된다고 한다.

A64 명령어들은 모두 32비트 길이이다.

(명령어들의 레벨 분류 - main encoding, instruction group, decode group, instruction - 에 대해서는 이해하지 못해 정리할 수 없었다)

같은 이름을 쓰고 피연산자를 달리 갖는 명령어가 있다. 예를 들어 아래 FMUL명령어는 두 개의 부동소수점을 곱한다. C 언어에서 a = b * c 와 같은 것이다. A64에서는 피연산자에 따라 아래에서 보여지는 것들 중 하나가 될 것이다.

fmul s0, s1, s2            ;single precision floats
fmul d0, d1, d2            ;double precision floats
fmul v0.2s, v1.2s, v2.2s   ;vectors with two singles
fmul v0.4s, v1.4s, v2.4s   ;vectors with four singles
fmul v0.2d, v1.2d, v2.2d   ;vectors with two doubles
fmul s0, s1, v2.s[0]       ;multiplies by a vector element
fmul d0, d1, v2.d[0]
fmul v0.2s, v1.2s, v2.s[0] ;combinations of the above
fmul v0.4s, v1.4s, v2.s[0]
fmul v0.2d, v1.2d, v2.d[0]

이렇게 하나의 FMUL에서 많은 변형이 생기게 된다. 모든 대표 명령어에서 이렇게 변형이 많이 생기는 것은 아니다. 그래서 이런 변형까지 다 계산하면 모든 명령어의 수는 1000에서 2000개 정도가 된다고 한다. 명령어세트 설계자는 이들 변형과 피연산자까지 모두 포함하여 32비트 길이의 공간에 인코딩해야 하며 혹시라도 나중에 추가될 수도 있는 부분을 위한 여분까지 남겨두어야 할 것이다.


나머지 부분은 이해를 못해서 제외한다.

'Programming' 카테고리의 다른 글

ARM A32 명령어셋 VZIP  (0) 2019.03.11
ARM A64 명령어셋 ZIP1, ZIP2  (0) 2019.03.11
Bash에서 문자열 검색 조건식 만들기  (0) 2018.07.22
Truncate PWD in prompt (MacOS)  (0) 2018.04.29
Regular expression in sed  (0) 2018.04.25

EIN and virtualenvwrapper

Emacs

Emacs와 IPython을 함께 쓰기위한 설정을 만지던 중, 특정 virtualenv와 연동하는 부분에서 좀 막히게 되었다. 완벽한 솔루션은 아니지만 기록해둔다.

초반 삽질: elpy

Emacs Python IDE로 모드 중에 elpy가 눈에 띄었고, IPython관련 기능들도 있길래 이것으로 시작해 보았다. elpy는 pyvenv가 연동되며 자체에서 IPython 프로세스를 실행시키면 해당 pyvenv에 해당하는 IPython interpreter(Jupyter도 가능)가 뜨기 때문에 환경설정과 관련해서는 문제가 전혀 없었다.

하지만 곧 맞닥드린 문제가 있었는데, pyplot등으로 그린 표나 그림 등이 인라인으로 표시되지 않고 임시파일에 기록되어 미리보기(MacOS Preview App)등의 다른 윈도우에서 별도로 표시되는 것이었다.

인라인 표시 기능과 관련하여 한동안 찾아본 결과 org-babel이나 EIN(Emacs IPython Notebook)에서 가능하다는 정보를 알게 되었다.

Inline plot in emacs ipython REPL?

Emacs IPython Notebook

org-babel은 좀 아닌것 같아서 EIN을 들여다보기 시작했다. elpy처럼 자체에서 IPython REPL 프로세스를 띄울 수 있고, elpy에서 안되는 인라인 컨텐츠 표시도 잘 되었다.

하지만 EIN도 문제가 있었는데, 특정 virtualenv를 선택할 수가 없었다. 내 환경에는 virtualenv가 2개 - python3, python2 - 가 있는데 python3 환경에만 물렸다. 이렇게 되면 python3만 쓸 수 밖에 없다. 시스템에 python2랑 3가 둘 다 설치되어 있으면 브라우저 notebook 클라이언트에서는 둘 중 하나를 고를 수 있었는데, 특정 virtualenv와 물리게 되면 하나의 버전만 쓸 수 있다. 그럼 virtualenv에 python을 두개 설치하면? 확인해 본 결과 virtualenv는 하나의 python 버전만 사용하도록 설계되었단다.

Create a virtualenv with both python2 and python3

EIN and Jupyter with virtualenv

그래서 생각해낸 방법은 우선 터미널에서 virtualenv를 띄우고 거기서 Jupyter를 실행시킨 다음에, EIN에서 해당 Jupyter에 접속해서 notebook 환경을 사용하는 것이다. 이렇게 할 경우 터미널을 왔다갔다 해야 하긴 하지만 모든 문제가 해결된다. (해보진 않았지만) virtualenv/Jupyter 두 개 조합을 띄우고 둘 중 하나를 선택해서 들어갈 수도 있을 것 같다.

우선은 터미널을 띄우고 원하는 virtualenv를 활성화시킨다. 그리고 Jupyter를 띄우는데, 포트 번호랑 토큰(또는 암호)을 기록해둔다.

그리고 Emacs로 돌아와서 M-x ein:notebooklist-login 을 실행한다. 위에서 기록해둔 포트 번호와 토큰(또는 암호)를 입력한다. 그리고 M-x ein:notebooklist-open 을 입력하면 위에서 띄워놓은 notebook과 연결된다.

References

'Emacs' 카테고리의 다른 글

Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07
Emacs Server setting  (0) 2019.05.15