Links about Array DBMSs

This article just lists resources available in Internet and papers  about array DBMSs and scientific databases.

General

Applications of Array Data Model

  • Geo-spatial data
  • scientific data
  • financial feeds
  • sensor data
  • sequencing data

From Academia

General

Query Language or Interface

Query Processing

Applications

Data Format

SciDB From Paradigm4


Rust에서 LLVM Intrinsics 호출하기

요즘에는 내가 보려는 목적으로 기록을 하는 블로깅이 대부분인 듯 하다. Rust는 LLVM으로 구현되어 있고 LLVM 의 Intrinsics를 함수에 매핑해서 호출할 수 있는 기능이 공식적으로 제공된다. 예제는 아래와 같다.


LLVM을 이용한 JIT 코드 개발 정리

현재 작업 중인 Tokamak (가제) 프로젝트서 사용될 LLVM JIT 코드 몇 가지를 작성해보았다. Rust로 작업하고 있기 때문에 llvm-alt 라는 바인딩 라이브러리를 fork해서 작업을 진행했다. fork 한 이유는 버그와 미구현 API 때문인데 maintenance가 기존에 리포트된 버그도 수정 안되길래 아예 fork 해버렸다.

LLVM은 레퍼런스 문서는 참 훌륭하다. 또한 LLVM IR 자체가 프로그래밍 코드와 비슷해서 Java Bytecode를 보다 훨씬 쉬운 듯 하다. 자체는 쉬운 편인데, 친절한 문서는 별로 없다. 만든 녀석들이 워낙 똑똑한 녀석들이라 나 같은 초보들이 뭘 필요하는지는 잘 모르는 모양인데 이 글에 익힌 몇 가지 정리를 한다. 이 문서의 목적은 내가 보기 위해서기 때문에 체계적이지도 않고 부연설명도 없다.

MJIT vs ORC

  • MCJIT 전에는 JIT 였음, JIT 는 LLVM 3.5에서 제거됨
  • MCJIT는 더 많은 타겟에 대한 네이티브 코드 지원
  • MCJIT는 lazy compilation 지원안함, ORC는 지원함. 다시말해 ORC는 함수 실행 전에 code generation을 하기 때문에 일반적으로 code generation time이 짧음
    • 의문1: ORC는 thread safe 한가? (관련 링크)
    • 의문2: thread safe를 위한 성능 손해는 없는가?
  • 많은 새 프로젝트들은 MCJIT보다는 ORC 선택 중 또는 기존 프로젝트들도 전환 중

IR 코드와 Bitcode (BC)

  • 프로그래밍 언어는 LLVM 거치면 IR로 변환되고 IR은 다시 BC로 변환되어 최종적으로 native 바이너리 형태로 변환된다. IR과 BC는 어디까지나 LLVM을 위한 intermediate representation 코드임
  • IR은 human readable representation 이고 BC는 더 컴팩트한 바이너리 포맷. 로딩은 당연 후자가 빠르므로 런타임 로딩을 위해서는 미리 BC로 빌드를 해놓아야 한다.
  • JIT 코드 작성 시에 IR 코드 생성을 해야 할 필요가 있는데 이는 프로그래밍 언어와 JIT 간에 interoperation 을 위해서이다.
    • 예를 들면 JIT로 작성한 함수가 인자로 받을 구조체는 프로그래밍 언어에서도 가용해야 하는덷 이런 경우 c++ 등으로LLVM JIT에서 사용할 구조체와 함수등을 구현해 놓고 c++ 코드에서는 해당 구현을 사용하고 LLVM JIT에서는 미리 생성된 IR을 사용한다.
  • IR 을 파싱하고 로딩해서 모듈을 생성할 수 있다.
  • 생성된 모듈에서 iterator 를 통해 함수 리스트를 얻을 수 있다.
    • 이때 함수에 attribute를 부여할 수 있는데 예를 들면 AlwaysInline 같은 것..
    • AlwaysInline 속성은 JIT로 작성된 코드 내부에서 호출하는 다른 JIT 함수들은 전부 inlining이 된다. 즉 함수 호출 비용이 줄어든다.
      • LLVM JIT를 굳이 어렵게 쓰는 이유는 interpretation cost를 줄이고 복잡한 로직을 주어진 정보를 통해 단순화 시켜 브렌치를 제거하기 위함인데 inlining은 이 목적에 잘 부합한다.
      • 다른 속성도 살펴봐야..
  • Clang을 통해 emit-llvm 할 경우 extern 으로 감싸야 llvm 으로 함수에 접근 가능하다.
  • Clang을 통해 emit-llvm 할 경우 활용되지 않는 구조체는 컴파일러 레벨 최적화에서 제거 되기 때문에 IR에도 표현되지 않는데 이런 경우를 방지하려면 private dummy 함수를 만들어 인자에 struct들을 다 넣어버리면 IR에 struct를 유지시킬 수 있다.
  • Clang을 통해 emit-llvm 할 경우 같은 구성을 가진 구조체는 서로 구분하지 못한다. 따라서 다른 구조체의 symbol 이름으로 IR이 출력될 수 있다.

LLVM 링크 정리

Documentation Links

Presentation Materials

Sample Codes

Tools


Awesome documentation links for Rust

I wrote down the useful links that I have learned. I’ll continue to update it.

General

Abstraction

Ownership

Object Safety

FFI

Iterator

Pattern Matching

Error handling

biild.rs

Examples

Idiomatic Usages of Rust

API Design

Ownership

Network and I/O

Macro

MIO

Projects Worth Watching

Papers

Profiling

Updates

  • Oct 15, 2015 – Added The Little Book of Rust Macros.
  • Nov 3. 2015 – Add ‘Rust Design Pattern’ and ‘Exposing Rust struct to Python’

Git에서 GPG key로 signoff 하기

공헌자들 패치를 받아서 커밋할 때, 컨트리뷰터의 author를 유지하면서 또한 커미터가 직접 확인했다는 증명을 signoff 기능을 통해 할 수 가 있다. 그런데 signoff 가 단순하게 커밋로그에 남는 ‘메일 주소와 이름 뿐’인 태그일 뿐이라서 진짜 그 사람이 signoff를 했는지 증명하는 것이 어렵다는 문제가 있다. 다행히 git에서는 GPG key를 이용한 signoff 기능을 제공한다. 우선은 내가 볼 목적으로 그리고 동료들에게 설명할 목적으로 정리를 해본다.

GPG에 대한 사용법은 생략한다. 우선 자신의 Key id를 얻는다.

그리고 git config의 user.signingkey로 GPG key id를 설정한다. 각 repository 마다 설정하고 싶으면 –global 옵션을 빼면 지정 repository에만 (현재 디렉토리의 git repository) 지정할 수 있다.

그리고 커밋을 한다. 아래 옵션이 많지만 GPG key로 사인을 위한 옵션은 -S 이다.

GPG key-agent가 켜져 있다면 패스워드 직접 입력없이 자동으로 위에서 설정한 키로 사인과 함께 커밋이 된다. 그럼 확인해보자.

‘not certified’라고 나올 수 가 있다. key가 로컬 머신에 등록되어 있지만 trust key로 설정되어 있지 않아서 그렇다고 한다 (자세히는 모름). 해결은 아래와 같이 --edit-key 옵션으로 한다.

그리고 다시 확인해보자.

Warning이 없어진 것을 알 수 있다.

See Also


Jni Native를 통한 Rust 함수 호출

회사 허락을 맡아 홀로 프로젝트를 하나 시작했다. 큰 그림은 일부 컴포넌트를 Rust로 구현하고 컴포넌트간 연결은 rpc로 하는 것인데 아직 Rust 로 rpc 구현을 하기에 시간이 더 필요하다. 임시적인 수단으로 JNI를 통해 기존 컴포넌트에 연결을 하려고 한다.

그 외 프로젝트에 자세한 이야기는 나중에 설명하고 위 목적으로 Stackoverflow 에서 참고하고 https://github.com/Monnoroch/RustJni 를 참고해서 JNI를 테스트를 해봤다.

C 바인딩이 쉬운것은 Rust의 장점 중 하나인데 JNI 바인딩 역시 순조로웠다. 방법은 우선 아래와 같이 native 함수 인터페이스를 작성하고

아래와 같이 Rust 코드를 작성하면 된다.

이게 전부다. 위에서 사용된 chars_to_str와 str_to_jstring 는 아래 github repository에 있다.

https://github.com/hyunsik/jni-rs/blob/master/src/helper.rs

위 repository 는 https://github.com/Monnoroch/RustJni를 fork 해서 JNI 뿐 아니라 JNI 프로그램 작성 중에 반복되는 코드들에 대한 유틸리티 함수들을 추가할 계획이다.

그리고 아래는 JNI Native + Rust 를 위한 템플릿 프로젝트이다.

https://github.com/hyunsik/rust-jni-template