Vector APIを理解するためにSIMD命令をCで試す

JavaVector APISIMD命令を呼び出すためのAPIです。
ということで、実際にSIMD命令を知っておいたほうが理解が深まる気がします。
ただ、直接SIMD命令を試すのはめんどいので、C++から呼びだしてみます。

Cの文法とかだいぶ忘れてるというか知らないものが多いので、適当にぐぐりながら書いてみました。

#include<cstdio>
#include<x86intrin.h>

typedef __attribute__((aligned(32))) struct {
    double x;
    double y;
    double z;
    double w;
} Vec;

int main(void) {
  Vec v1 = {2, 3,4, 0};
  Vec v2 = {3, 4, 5,0};
  const __m256d d1 = _mm256_load_pd((double*)&v1);
  const __m256d d2 = _mm256_load_pd((double*)&v2);
  const __m256d r = _mm256_add_pd(d1, d2);
  Vec *v3 = (Vec*)&r;
  printf("%f, %f, %f\n", v3->x, v3->y, v3->z);
}

最初まったくコンパイルが通らなくてあきらめたんだけど、 Twitterで-mavx2とかつければいいと教えてもらいました。
https://twitter.com/objectxplosive/status/1165307957417930752

$ gcc -mavx2 hello.cpp -o hello
$ ./hello
5.000000, 7.000000, 9.000000

無事うごいた。

OpenJDK Committer's Workshop 2019 - Day 2(JVMLS Day 5)

CommitterではないけどOpenJDK Committer's Workshop(OCW)に参加しています。
OpenJDK Committers’ Workshop

初日はこちら。
OpenJDK Committer's Workshop 2019 - Day 1(JVMLS Day 4) - きしだのHatena
f:id:nowokay:20190803084232j:plain

Unconference

今日もアンカンファレンス形式で行います。というStuart Marksさんの話。
f:id:nowokay:20190803084026j:plain

ということで、トピックを持ってる人は書き出します。
f:id:nowokay:20190803084031j:plain

それぞれ自分のトピックを説明。
f:id:nowokay:20190803084035j:plain

そして投票します。
f:id:nowokay:20190803084038j:plain

RMI De-evolution気になるけど人気なかった・・・
f:id:nowokay:20190803092122j:plain

Graal JIT Adoption

f:id:nowokay:20190803092033j:plain

Graal JITについてのディスカッション。Twitterの人など、JITをやってる人が集まっていました。 f:id:nowokay:20190803084052j:plain

Graalに興味がある人っていう質問に手をあげる人はたくさんいたのだけど、Graalを使ってる人っていう質問ではTwitterの人が手をあげただけでした。

話題としては

  • libgraalがプロファイルを汚染しないとか
  • GraalVM CEとEEの違いはなんなの? -> EEの機能は完全に分離してるからOpenJDKとしては忘れて。みんなが使ってたらOpenJDK/CEにポートもあるのかも?
  • Twitterの人のGraalロードマップ(完全にぼーっとして聞き逃してもったいない)
  • Native Imageのデバッグ情報ってどうなってるの? -> SubstrateVMでは?
  • C2とGraalを同時に使えるか -> 技術的には可能。C2の性能がよいけどGraalはEscape Analisysが強い
  • C2はDeprecateできる? -> 難しそう
  • LLVMバックエンドがどうのこうの

という感じで、いろんな話が行われておもしろかったです。C2をどうするかという話が結構時間をとってた気がする。

Preview Featured: Experiences + Enhancements

f:id:nowokay:20190803092044j:plain

Alex BuckleyさんとBrian GoetzさんによるPreview機能についての話
f:id:nowokay:20190803084058j:plain

話題としては3つ

  • IDEとか他のツールでの対応めんどくない?
  • フィードバック目的だけどうまくいってる?
  • APIへの影響は?

IDEなどのツールへの影響というのは、たとえばValhallaのように独立したEAとして出ると対応する必要だけどPreviewとしてリリースに入ると対応が必要であることを言っています。
IDEだとswitch式の構文対応やリファクタリングがありますね。また、JDK12では値を返すのがbreakだったけどJDK13ではyieldになります。 JDKでは値を返すbreakは不要になりますが、IDEでは保持する必要があります。
そのことについて、JetBrainsの人が、サポート大変だけどがんばる!と言ってました。
f:id:nowokay:20190803084110j:plain

フィードバックという点では、たとえばLambdaは機能ごとのプレビューリリースが出ていましたが、試用する人が少なかったということです。
ただ、それでpreviewとして入れてフィードバックがあったのかという点では、期待していたより少ないということです。preview使ってる人という質問にはたくさんの手があがりましたが、フィードバックした?という質問にだれも手をあげず苦笑。
6ヶ月ごとのリリースでは短いんではという指摘もありました。

APIへの影響というのは、たとえばText Blocks (Preview)ではstripIndentなどのメソッドが入りますが、これはDeprecatedではありますが--enable-previewをつけなくても使えます。
Preview用のアノテーションはどうだろうという話がでていました。 また、もしPreview機能導入によって動きがかわるメソッドがあるとき、どうやってフラグするかという話も出ました。

Portola/Alpine

f:id:nowokay:20190803092100j:plain PortolaプロジェクトをやっているMikaelさんによるAlpine対応の話
PortolaプロジェクトはJDKをAlpine Linuxに対応するためのプロジェクトですが、Cライブラリがglibcではなくmuslになっていて対応が必要です。

「This is my hobby project」と言ってたのでメーリングリストを確認してみたら、Mikaelさんがひとりでやってる感じですね。
f:id:nowokay:20190803084118j:plain

BellSoftの人が、Alpineを使ったDockerイメージをリリースしているので、少し話していました。 f:id:nowokay:20190803110451j:plain

How to promote Java new great features to people outside this conference

f:id:nowokay:20190803092112j:plain Vladimir Kozlovさんによる、Javaの素敵機能をどう広めるかという話

JDK8からJDK11で、156のJEPと4961の機能改善が入ったのをどう広めるかという話ですね。
f:id:nowokay:20190803084132j:plain
多くがJDK9でのモジュールシステムがらみな気がするけど。

リリースノートが見にくいんではという話も出てた気がする。 f:id:nowokay:20190803110444j:plain

Finish

これでOpenJDK Committer's Workshopは終了。
f:id:nowokay:20190803084222j:plain

6ヶ月後にブリュッセルで会いましょう、ということでした。FOSDEM 2020かな。
f:id:nowokay:20190803084225j:plain

お昼ごはんは出るので食べる。
f:id:nowokay:20190803084228j:plain

終わってから、ついでにNetwork Circleという名前のついている外周を歩いて帰って終了。おつかれさまでした!
f:id:nowokay:20190803084237j:plain

OpenJDK Committer's Workshop 2019 - Day 1(JVMLS Day 4)

JVM Language Summitが終わると、引き続いてOpenJDK Committer's Workshop(OCW)が開かれるので、コミッターではないけど参加してみました。
OpenJDK Committers’ Workshop

JVMLSはこちら。
JVM Language Summit 2019(JVMLS) day 1 - きしだのHatena
JVM Language Summit 2019(JVMLS) day 2 - きしだのHatena
JVM Language Summit 2019(JVMLS) day 3 - きしだのHatena

Unconference

まず最初にMark Reinholdさんの開始のあいさつ。ほんとは9時開始だけど9:20くらいまでぐだぐだしてた気がする。
f:id:nowokay:20190802150747j:plain

コミットが多い会社の一覧。それぞれの会社に所属している人が順に起立してみんなで拍手。
f:id:nowokay:20190802150753j:plain

OCWは事前にタイムテーブルが決まっていないアンカンファレンス形式で行われます。というStuart Marksさんからの説明
f:id:nowokay:20190802150756j:plain

まずは話し合いたいネタがある人がトピックを書いて貼っていきます。
f:id:nowokay:20190802150800j:plain

そして、それぞれ短く説明のピッチ。 f:id:nowokay:20190802150811j:plain

そのとき、前のほうの席で関係ない話をしてたGilさんにReinholdさんが声を抑えてってジェスチャーしにきたり、時間を超過してピッチしてたGilさんに時間切れ〜とReinholdさんがやってたりして面白かった。

そのあと、みんなで投票して、内容が決まります。 f:id:nowokay:20190802150818j:plain

Project Skara

最初はあらかじめ応募があったSkaraの話。
f:id:nowokay:20190802150822j:plain

Project Skaraは、現在Mercurialで管理されているOpenJDKのソースをGitに移行するというプロジェクトです。すでにGitHubリポジトリが作られて、リポジトリがミラーされています。メインリポジトリだけではなく、ValhallaやPanamaなどのプロジェクトやJMCのようなツールなど周辺プロジェクトもリポジトリが作られています。
OpenJDK

そうすると、WebRevというツールとメーリングリストで行われているコードレビューの代わりにPull Requestを使いたいとか、Bug管理の代わりにGitHubのIssueを使いたいとか、開発作業のツールもGitHubに移行する必要が出て、どうしようかという話でした。

JEPはこれです。
JEP 357: Migrate from Mercurial to Git

すでに資料は公開されています。
http://cr.openjdk.java.net/~darcy/Presentations/OCW/ocw-2019-08-skara.pdf

Warmup

AzulのCTOであるGil Tateさんによる、Javaのウォームアップの話
f:id:nowokay:20190802150825j:plain

JVMではJITが進むごとにパフォーマンスがあがって、ピークパフォーマンスが出るまでにしばらくかかります。
f:id:nowokay:20190802150830j:plain

サーバーが複数台あると、そういうピークパフォーマンスが出る前の状態をそれぞれ経過することになりますが、これは無駄です。 f:id:nowokay:20190802150834j:plain

その問題に対処するために、AzulのJVMであるZingでの実装や、JVMLS2日目で話されていたJWarmup、OpenJ9のJITキャッシュなどがあります。
f:id:nowokay:20190802150839j:plain

これは通常のOpenJDKとGraalVMネイティブイメージ、CRaCを使ったものの比較で、ネイティブイメージほどではないですが、起動時間が短縮できています。
f:id:nowokay:20190802150843j:plain

起動時間の短縮には、ネイティブイメージ以外にもいろいろなアプローチがあるんだなぁという感想でした。

Lanch

ここで昼休み
f:id:nowokay:20190802153806j:plain

同じテーブルにいた人が、テストをどうするかっていうセッションの提案をしていたAdoptOpenJDKのひとに、OpenJDKにコミットするのめっちゃハードル高い、自分が使ってない環境でのテストとかできないと相談していました。
AdoptOpenJDKでは、そういった環境も提供したい、ということを言っていました。

ごはんを食べたら、午後からのタイムテーブルの発表です。
f:id:nowokay:20190802150846j:plain

こんな感じに1階と2階にわかれて全部で8セッション行われます。 f:id:nowokay:20190802142355j:plain

Core Lib、JFR Enhansment

Stuart Marksさんによるコアライブラリにロギングやメトリクスを入れる話。 f:id:nowokay:20190802150852j:plain

あとJFRの話。

よく聞いてなかった。

Virtual Container

Alibabaの人たちによるVirtual Containerの話
f:id:nowokay:20190802150858j:plain

JVMのレベルで仮想化しようという話
f:id:nowokay:20190802150901j:plain

Amazon Corretto Crypt Provider

Correttoのなにか。
f:id:nowokay:20190802150906j:plain

Finalization

finalize()をどうやって滅ぼすかという話。
f:id:nowokay:20190802150913j:plain

8/9 追記 問題 GC実装の複雑化とオーバーヘッド

代替 java.lang.ref.Cleaner ReferenceQueue

進捗 JDK9からdeprecated baseモジュールではほぼ変更・削除されている(クライアントやJavaFXで残ってる)

3rdパーティーライブラリはどうする? ドキュメント・広報など どのくらい時間が? ステップは?

イデア GCでfinalizeを無効にする スイッチをつける デフォルトをあとで変更する アプリケーションは失敗したりdegradeするかも

GC

CMSをどうやって滅ぼすかという話。
f:id:nowokay:20190802150918j:plain

手書きでしたね。そして、WindowsじゃなくUbuntuっぽい。
f:id:nowokay:20190802150923j:plain

14で消すぞ、ってことらしい。
なんで14よりあとじゃないの?って質問には、まあみんなLTSしか使わないからLTS以外ならどこでやっても同じなんでは?と言ってた。

Dinner

という感じでOpenJDKの大きめの問題についてみんなで議論する、という感じでした。
あしたの予定はJVMLSをどう広めるかとPanamaの話っぽい。のこりはまた明日アンカンファレンス形式でというStuart Marksさんからの話。
f:id:nowokay:20190802150929j:plain

晩ごはんはそのまま近所で食べるので、歩きます。Oracleキャンパスを出たところの道が「Sun Fire Way」という名前なんですが、Sun Microsystemsのサーバー「Sun Fire」から来ているらしい。
f:id:nowokay:20190802160309j:plain

晩ごはんは、jyukutyo御用達のチポトレ
f:id:nowokay:20190802150942j:plain

注文のしかたぜんぜんわからんだった。あとこれ1000KCal以上あるっぽく、全部食べたらおなかいっぱい+αになった。けどおいしかったです。
インスタ映えしないけど。
f:id:nowokay:20190802150946j:plain

こちらはインスタ映えするskrb
f:id:nowokay:20190802150950j:plain

ついでに同じエリアにあるSafewayというスーパーで、KOMBCHAという謎の飲み物を教えてもらいます。昆布のお茶ではなく、紅茶キノコ系らしい。
ここに写ってるのほとんど全部KOMBCHAです。
f:id:nowokay:20190802150954j:plain

新しい知識も仕入れたところで、OCW1日目終了です。またあした。 f:id:nowokay:20190802151000j:plain

JVM Language Summit 2019(JVMLS) day 3

JVMLSに来ています。3日目。
JVM Language Summit — July 29–31, 2019

2日目まではこちら。
JVM Language Summit 2019(JVMLS) day 1 - きしだのHatena
JVM Language Summit 2019(JVMLS) day 2 - きしだのHatena

今日は3つのセッションとLTです。 終わったあとはみんなでコンピュータ歴史博物館に行きました。

Annotation for Java

寝坊して遅刻・・・
最初はNonNull/Nullableをアノテーションを使って型システムに組み込む話。
f:id:nowokay:20190801210248j:plain

Map.getはNullableだけど、コード上NonNullになるときもあるよね、とか。
f:id:nowokay:20190801210253j:plain

動画は今の時点(西海岸時間 3:28 日本時間19:28)ではアップされていませんね。

Fast type checking for Ruby

Sorbetというtype checkerを使ってRubyに型検査を導入する話
Sorbet · A static type checker for Ruby f:id:nowokay:20190801210404j:plain


Gradual typing for Ruby at Scale with Sorbet - Dmitry Petrashko

LT

ここで3つLT

最初は"It's time to remove checked exceptions!"っていう、ネタ的な話。LTらしさある。
f:id:nowokay:20190801210411j:plain

2番目はAzulのGilさんによる、Javaにチェックポイントを入れる話。 f:id:nowokay:20190801210415j:plain
動作中のJVM上の状態を保存して他のマシンで再開できるようにする、みたいな話でした。

3番目はEclipseの人の、Javaエディタをどう実装してるかという話。
f:id:nowokay:20190801210428j:plain

Differentiable Programming

機械学習でコーディングをもっと改善する、という話。
f:id:nowokay:20190801210442j:plain

FacebookのDeveloper InfrastructureチームのErik Meijerさんの話です。Wikipediaあるのね。
Erik Meijer (computer scientist) - Wikipedia

Aromaというツールを作っています。
Aroma: Using ML for code recommendation

資料がほぼ全部イラスト入りの手書きでめちゃくちゃかわいい。
f:id:nowokay:20190801210451j:plain

一番最初、ちょっと政治的な話から始まりましたが、YouTubeではそのあとから収録されてますね。
f:id:nowokay:20190801210436j:plain

話し方もめちゃくちゃおもしろくて、何の話をしてるかその場では全然わからなかったのだけどなんか面白い、という感じでした。
昨日のjWarmupの人は話の内容は面白いはずなのにずっと手元をみていて話し方が面白くなかったので、なんも面白くなかったというのと対照的。
というか、何の話をしてたかわかった上でYouTube見返すと、めちゃくちゃ面白いな、これ。

内容のほとんどは、二重数を導入して自動微分するという話でした。
f:id:nowokay:20190801210448j:plain
eは二乗すると-1になる数ですが、二乗すると0になるεを導入してa+bεという数を定義すると自動微分ができるっぽい。
二重数で自動微分する - Qiita

Scalaで二重数を定義して、各演算も定義すると、こう。
f:id:nowokay:20190801210455j:plain

で、なんかニューラルネットワークのコードがすっきり実行効率よく書けるようになるのだけど、最後にJVM線形代数ライブラリを導入してくれ〜そしたらPython使わなくていいんだ、という話で終わりました。
f:id:nowokay:20190801210507j:plain


Differentiable Programming with Erik Meijer

Lunch

ということで、 @ajis_ka による終わったのポーズでJVMLS終了です。
f:id:nowokay:20190801210512j:plain

ランチも出てましたが、Mountain ViewのComputer History Museumに行くのでそのあたりで食べるということに。
f:id:nowokay:20190801210518j:plain

行こうとしてた店はいっぱいだったので、隣の韓国料理屋さんで石焼ビビンバ。
f:id:nowokay:20190801210531j:plain

Computer History Museum

ということで、Computer History Museum
f:id:nowokay:20190801210634j:plain

Crayとかあってテンションあがる
f:id:nowokay:20190801210624j:plain

MSXもあった!
f:id:nowokay:20190801210544j:plain

データベースの記号がなんであんな形なのかわかるハードディスク
f:id:nowokay:20190801210621j:plain

説明をみてる @jyukutyo
f:id:nowokay:20190801210535j:plain

あと、IBM 1401の実際に動くデモがあったので見ます。
f:id:nowokay:20190801210548j:plain

デモの流れはこのツイートにぶらさげてるので、こちらを。

まんなかに鎮座するのがProcessor Unit。つまりCPU。
f:id:nowokay:20190801210600j:plain

メモリはコアメモリといって、磁石で記憶するやつ。6$/bitらしい。1401には4KBのメモリが載ってるらしいので、2000万円くらいですね。
f:id:nowokay:20190801210606j:plain

これがそのコアです。手は @skrb f:id:nowokay:20190801210616j:plain

楽しかった。

Dinner

晩ごはんを食べに、Mountain Viewのダウンタウンまで30分ほど歩きます。
f:id:nowokay:20190801213043j:plain:w400

途中、Googleのオフィスがあったりする。
f:id:nowokay:20190801210647j:plain

そして、まずはスイーツ。 f:id:nowokay:20190801210658j:plain

となると、スイーツを撮る @skrb を撮るのは重要
f:id:nowokay:20190801210710j:plain

そのあと、自家醸造してる Tied House Cafe & Brewery
f:id:nowokay:20190801210716j:plain

ビールを!Alpine Goldおいしい。
f:id:nowokay:20190801210720j:plain

ハンバーガー、1/3サイズというのを頼んだら、マクドナルドの倍くらいの出てきました。1/1サイズどんだけ・・・
f:id:nowokay:20190801210730j:plain
1/2ポンド400gが標準らしくその1/3なので75gくらい。 @megascus 情報でマクドナルドが45gなので、やはり大きい。
8/2 追記 @skrb 情報で、1/3ポンドということなので150gっぽい。

ということで、JVMLS最終日終了。おつかれさまでした!

JVM Language Summit 2019(JVMLS) day 2

JVMLSに来ています。2日目。
JVM Language Summit — July 29–31, 2019

初日はこちら
JVM Language Summit 2019(JVMLS) day 1 - きしだのHatena

今日はほぼ1日を通してコンパイラの話でした。
ちなみに、普通はJavaの文脈でコンパイラというとJavaソースコードJavaバイトコードに変換するツールを指すと思いますが、このイベントではJavaバイトコードをネイティブコードに変換する仕組みを指します。

軽いまとめにしようと思ったけど、今日のWorkshopは結構おもしろかったのだけど資料も動画もなく、記憶だけが頼りなので、いまのうちにちゃんと書いておきます。

JIT and AOT in the JVM

JITとAOTの話。
このセッションはすごく面白かったので、ひとつ動画を見るならこれをおすすめします。
f:id:nowokay:20190731190346j:plain

朝ごはんを食べながら聞いてます。 f:id:nowokay:20190731190303j:plain

JITとAOTについて比較しながら話がすすみます。
f:id:nowokay:20190731191918j:plain

JIT結果をキャッシュすることについてJ9だなーと思いながら見てました。
f:id:nowokay:20190731191923j:plain

比較はこんな感じに。
f:id:nowokay:20190731191926j:plain

そしてJITサーバー!!おもしろいことを考えるなーと思いました。
f:id:nowokay:20190731191930j:plain

そこまで含めた結果はこんな感じ。
f:id:nowokay:20190731191935j:plain


JIT and AOT in the JVM with Mark Stoodley

Improving GraalVM Native Image

GraalVMのNative Imageについてのセッション。
初期の想定と実際の利用が違う、という話と、今後どうするかという話でした。 f:id:nowokay:20190731193101j:plain

いつものGraalVMの紹介
f:id:nowokay:20190731193054j:plain

制約として、最適化するところを決めるのに全部のバイトコードを見る必要があるということなどがあります。
f:id:nowokay:20190731193110j:plain

初期の想定ではOracleデータベースに様々な言語を埋め込むために使うということで、コードはひとつのチームで書かれて制約に従うことができるし、プラットフォームも絞れるし、リフレクションやJNIは不要だと考えたということです。なので最初はTruffle推しだったんだな。
f:id:nowokay:20190731194041j:plain

けど実際にはマイクロサービスやコマンドラインで便利だった、と。そうすると初期の想定がくずれたということです。 f:id:nowokay:20190731194049j:plain

対応のひとつとして、LLVMを使うといろんなプラットフォームに対応できてiOSでも動かせる、って話。 f:id:nowokay:20190731193114j:plain


Improving GraalVM Native Image with Christian Wimmer

GraalVM Workshop

GraalVMのネイティブイメージ生成についてのWorkshopでした。
f:id:nowokay:20190731195622j:plain

主な話題は実行時の話ではなくてコンパイルに時間がかかりすぎることでした。コード生成自体ではなく静的解析に時間がかかっているとのこと。
部分コンパイルはどうか、という話には、最適化が呼び出され方で決まるところから難しいということでした。(ここで部分コンパイルはコードの一部が変更されたときにその部分だけコンパイルしなおすことを指すと思います)
同じような理由で、Shared Libraryのようにjarライブラリを事前にコンパイルしておくというのも難しいとのこと。

というのを書きながら、gccのO2、O3みたいに最適化の深さを決めれるようにできないのかなと思った。機会があったら聞いてみよう。

次に、Static Initializerの設定を自動化できないのか、という質問がMark Reinhold氏からありました。
f:id:nowokay:20190731195633j:plain
効率よく実行するためには、Static Initializeをビルド時に行うか実行時に行うかを設定で書く必要があります。ビルド時にできる初期化はビルド時に行うほうが効率がよくなる一方、たとえばstart=currentTimeMillisのような処理をビルド時に行ってビルド時刻を埋め込むのは無意味なので実行時に行う必要があるからです。現在は安全側に振って実行時に行う設定になってますがこれを自動判定できないのか、ということです。
やはり難しそうで、MicronautやQuarkusではフレームワークに設定が埋め込まれているという話をしていました。

あとは、Unsafeは特別対応が必要でたとえばNettyではDirectByteBufferを使っているとか、8バイトのオブジェクトハンドルが4バイトの圧縮ポインタになるのでヒープが圧縮できるとか、AppCDSはあまり助けにならないとか、コンパイルイメージのヒープは読み込み専用にできる(ので効率がよい)とか、マルチクラスローダーはIssueでモジュール構造が助けになるけどみんなモジュール使ってないとかいう話をしていました。
それと、LLVMをバックエンドとして導入することについて、マルチスレッドが弱いという話とGCの問題があって、コンセプト検証の段階だけどiOSで動かすには重要という話。

という感じで、結構おもしろい話が繰り広げられていました。

JIT and AOT in the CLR

CLRでのJITの話。
あまり興味ない人が多かったぽく、空席が結構できてました。
f:id:nowokay:20190731194900j:plain

明確には書いてないけど、前提としてGUIアプリで使うというのがあるっぽい。なので、二回目の起動からはJIT結果を使いまわせるようにしてるという話。
f:id:nowokay:20190731194909j:plain

いろいろ作ってて、いまは3世代目を作ってるということで、それぞれの世代の説明をしていました。
f:id:nowokay:20190731194913j:plain


JIT and AOT in the CLR with Mei-Chin Tsai

Lunch

昨日のごはんが辛かったのだけど、今日は辛くなく、代わりにナスのようなものが辛かった。
f:id:nowokay:20190731191027j:plain

デザートもありますが、だいたい取り損ねる。
f:id:nowokay:20190731191007j:plain

jWarmUp

Alibabaで作ってるjWarmupの話。
JEP draft: JWarmup precompile java hot methods at application startup f:id:nowokay:20190731195857j:plain

どうやってウォームアップするかという話でした。 f:id:nowokay:20190731195909j:plain

質疑も結構でてましたが、よく覚えてない・・・
f:id:nowokay:20190731200208j:plain

プレゼン中は終始手元を見ながら話していましたが、質疑のときにようやく前を向いた写真がとれた。
f:id:nowokay:20190731195919j:plain

動画は まだ公開されてませんが、そのうち見れるようになると思います。

TornadoVM

JavaコードをGPUFPGAで動かすという話。
JEPもある!
JEP draft: Enable execution of Java methods on GPU
f:id:nowokay:20190731200939j:plain

デモとしてKinectデータから3Dを作るコードをGPU化するとすごく速くなるというのを見せていました。
f:id:nowokay:20190731200945j:plain

コードにはforループに@Parallelをつける感じ。
f:id:nowokay:20190731200948j:plain

そうするとOpenCLに変換される。Aparapiを思い出す。
f:id:nowokay:20190731200959j:plain

TwitterのChrisさんが、なんでSmatraを引き継がなかったの?って質問がでてました。あれはStreamの最適化だったからという答えだったけど、AMDがプロジェクトを止めているので引き継ぎにくいよねという話をskrbさんとしていました。

あと、話の中ででなかったので、FPGAのビルド時間は問題にならないのか聞いてみたら、やはりコンパイルには2時間くらいかかるらしく、コンパイルをどのタイミングでやるかというオプションがあるらしいです。飛ばした資料を見せてくれました。
f:id:nowokay:20190731201003j:plain
しかし、あの場での質問、ドキドキした。

こちらも動画は非公開になってますが、そのうち見れるようになるはず。

Panama Update

Panamaの話。
f:id:nowokay:20190731202057j:plain

資料に子どもの写真がはさまって、みんな笑顔だった。
f:id:nowokay:20190731202037j:plain

内容としては、ポインタAPIとか、
f:id:nowokay:20190731202044j:plain

構造体レイアウトとか。
f:id:nowokay:20190731202054j:plain


Panama Update with Maurizio Cimadomore

Metropolis Workshop

f:id:nowokay:20190731202418j:plain MetropolisはJavaJavaを実装するプロジェクトですが、Javaで実装したJITであるGraalの話で占められていました。

ちょっと遅れていったら、前に立つ人がボソボソ話してて、断片的に聞けて何の話をしてるかもなんとなくわかるんだけどどういう意図でその話をしているのかわからなくて、15分くらいして「This is my introduction」と言って、えー自己紹介かよーって思った。
そのあともいろいろ質問が出ていたりしたのだけど、席が遠いとよく聞こえなかったり、何の話をしてるのかよくわからなかった。
と思ったら、「それはGraalVM EEの話?」という質問があって、Graalの話だったはずなので関係ないのではと思ったら「OpenJDKの話」のような返事で、つまりみんなよくわかってないからよくわからない話が繰り広げられてたんだなーという理解。

そのあと、GraalにコントリビュートするならOpenJDKとGraalVMのどちらにすればいいの?という質問があって、これも結構ぐだぐだとしていたのですが、GraalVMのほうがupstreamであるということでした。そして、じゃあそれはどんな感じでsyncされるのという話になったのですが、どうもはっきり決まってない様子。だれかが、それを決めるのがWorkshopでは〜という発言をして、もっともだなと思いました。

あと、GCJavaで書かないの?という話がでたときに、Mark Reinhold氏が全部書きなおせばいいよと男前なことをおっしゃっていました。

こんな感じで、ぐだぐだとした状況をぐだぐだと話していた感じですが、これこそWorkshopだなという感じでもありました。
しかし英語弱者には つらい。
f:id:nowokay:20190731202421j:plain

Dinner

今日は公式ディナーの日。
f:id:nowokay:20190731191149j:plain

もちろん無限ビール!
f:id:nowokay:20190731191214j:plain

そして肉! f:id:nowokay:20190731191242j:plain

最初は店がさわがしくて向かいの人と話せず隣のjyukutyoと話してたのですが、人が減って静かになったときに、向かいに座ってたZuluでコンパイラを開発している人と話をしました。

ということで、今日もおつかれさまでした!

JVM Language Summit 2019(JVMLS) day 1

JVMLSに来ています。
JVM Language Summit — July 29–31, 2019

JVMLSはJava VM Language Summitの略で、JVMで動く言語に関するイベントだったのですけど、JVM言語の話はJavaも含めて減っていて、JVMの話がメインになっています。
f:id:nowokay:20190730142733j:plain

場所はサンタクララOracleキャンパスで、元はSunだったところ。
これは去年の写真ですが、普段は社員しか入れないところにSunの看板が、しかも初期のロゴのものです。 f:id:nowokay:20190730141839j:plain

技術的な内容につっこんでいくとキリがないので、気になる人は動画を見てもらって、セッションの雰囲気のメモを。

Clojure Futures

まず最初はClojureの話
f:id:nowokay:20190730173107j:plain

IFnというクラスを中心にいろんな実装の話をしていたのですが、最初なんでiPhoneの話をしてるんだろう?って思ってしまいました。
f:id:nowokay:20190730173510j:plain

そんなかで、constantDynamicを使う話をしてたら、JVMアーキテクトのJohn Rose氏からツッコミが入るという、JVMLSの恐ろしさをいきなり見せられてしまった。
f:id:nowokay:20190730173329j:plain


Clojure Futures with Ghadi Shayban

Loom Update

Project Loomの話。
f:id:nowokay:20190730175819j:plain

まずはBatemanさんからAPI関係。
tryブロックによって構造的並行化を行い、キャンセルやデッドライン・タイムアウトの処理をやるのが難しい〜という話。
f:id:nowokay:20190730175852j:plain

あと、ThreadとFiberが両方Strandを継承するという話になっていたのですが、継承関係のない独立したクラスになるようです。 f:id:nowokay:20190730180436j:plain

それからThreadLocalなどの話。
f:id:nowokay:20190730181112j:plain

実装状況として、すでにJDK11、12でもちょっとずつ変更が入ってて、13ではSocketが対応するなど準備は進んでるようです。 f:id:nowokay:20190730180454j:plain

で、登壇者交代してBackmanさんがVMの話 f:id:nowokay:20190730180732j:plain

frameをどう保持するかって話ですが、VMのことは ようわからん。
f:id:nowokay:20190730181241j:plain

最後にJohn Roseさんが出てきて、Fiberを集めたThreadをLoomで編んだタペストリ作ったのであとでみんなに送るね!と。
f:id:nowokay:20190730154758j:plain

Roseさんデザインですごくかわいい。
f:id:nowokay:20190730172550j:plain


Project Loom Update with Alan Bateman and Rickard Bäckman

Amber Workshop

ここで1階と2階にわかれてワークショップです。というか、質疑応答の時間、という感じですね。
1階ではLoom、2階でAmberですが、2階のAmberのほうに来ました。

ホワイトボードに書いていくスタイル。Amberでの言語拡張をまず並べて。 f:id:nowokay:20190730184513j:plain

Pattern Matchingのところで、Neal Gafterさんのツッコミ。NealさんはJava Puzzlerとかやってた人で、いまはMicrosoftで.NETやってます。
f:id:nowokay:20190730184516j:plain

だいたいこんな感じの話。

if (!(s instanceof T1 x)) {
  return;
}
// ここでxは使える?

とか

switch (s) {
  case instanceof T1 x1:
  case instanceof T2 x2:
}

とか。
f:id:nowokay:20190730184520j:plain

まあBike Shedの話だったねーとお昼ご飯のときに隣のグループの人が言ってました。だれか見てないけど、Javaのなにかを実装してる人じゃないかな。

Thread Sanitizing for Java

Thread Sanitizerの話。Googleの若手二人が登壇して、オレンジのBeylerさんは後ろから見てました。
f:id:nowokay:20190730182157j:plain

Thread Sanitizer(TSan)はJavaのレースコンディションを見つけるものです。JEPのドラフトも出てますね。
JEP draft: Java Thread Sanitizer
f:id:nowokay:20190730182201j:plain

デモとして、同じ変数を複数スレッドから1万回+1するコードを実行します。
f:id:nowokay:20190730182209j:plain

TSanを有効にすると警告がたくさん。コードを修正してsynchronizedをつけると警告がなくなりました!
f:id:nowokay:20190730182213j:plain

LLVMにはすでにTSanがあるということで、JavaのTSanもそれを利用するっぽい。 f:id:nowokay:20190730182415j:plain

ただし、いまはまったくパフォーマンスを考えていないので、TSanを有効にすると3倍から9倍遅くなって、メモリも1.5倍から4倍使うそうな。 f:id:nowokay:20190730182217j:plain

あと、JavaのプロダクトマネージャーのMark Reinholdさんからなんかツッコミが入ってましたね。やっぱり怖いイベントや。
f:id:nowokay:20190730182222j:plain


Thread Sanitizing for Java with Jean Christophe Beyler, Arthur Eubanks, and Man Cao

Lunch

ランチはビュッフェです。
f:id:nowokay:20190730160451j:plain

おいしい。
f:id:nowokay:20190730160334j:plain

食べ終わって外にでてみると、日本ではあまり見ない雲がでてました。
f:id:nowokay:20190730160233j:plain

Valhalla Update

Valhallaの話。
f:id:nowokay:20190730185715j:plain

最近L2というプロトタイプが出ていろいろ試せるようになったんですが、L10でプレビューが出て、L100でSpecializationが入るのでは〜って言ってた。先の長い話や。
f:id:nowokay:20190730185718j:plain

ベンチマークを出していたのですが、サンプルコードの最初のComplexクラスにinlineとついているのが見えます。Value Typeからinlineクラスに名前が変わったっぽい。
f:id:nowokay:20190730185724j:plain

あとはデフォルト値の話とかNullilyの話とか。
f:id:nowokay:20190730185727j:plain

あと、Objectクラスの下にRefObjectとValObjectが入って既存の参照型とinlineクラスがそれぞれその下に入るようなことを議論しているっぽい。
f:id:nowokay:20190730185730j:plain

最後に、やっぱJohn Rose氏がツッコミをw。マイク係をMark Reinhold氏がやってて、時間単価高いマイク係だ!と思っていました。
f:id:nowokay:20190730185736j:plain


Valhalla Update with Brian Goetz

Value Types in the CLR

.NETのCLRでのValuetypesの話。AgendaではValue Typesって書いてあったけど、.NETではValuetypesと空白なし小文字で書くのがただしいのかな。 最初はWrightonさん。 f:id:nowokay:20190730191145j:plain

JavaValue Type(いまはinlineクラス)との違いから。しかしこの人、紙を見ながら話していて、棒読みではないものの、資料繰りそこねて話してるところと表示してるものが違ってたり、どこ読んでるか見逃してしばらく止まってしまったり、プレゼン修行中ぽい感じでした。
f:id:nowokay:20190730191151j:plain

最後にNeal Gafterさんが話を。
f:id:nowokay:20190730191155j:plain


Value Types in the CLR with David Wrighton

Vectors and Numerics on the JVM

今日の最後のセッションはVector
最初はIvanovさんが「JohnがVector APIの話をするのでそのまえに会場をあっためておきます」とのことw
"I will warm the audience up before the John's part"
f:id:nowokay:20190730193351j:plain

APIデザインについて、取らなかったものとそうした理由などを並べていました。
f:id:nowokay:20190730193356j:plain

型をちゃんとつけるということで、「TypeNnnVector」という形のクラスができています。
f:id:nowokay:20190730193401j:plain

とかやって、Roseさんのターン
f:id:nowokay:20190730193409j:plain

デモをやってました。
f:id:nowokay:20190730193405j:plain

あと、API一覧
f:id:nowokay:20190730193414j:plain

そのまとめ
f:id:nowokay:20190730193418j:plain

あとはパフォーマンスの落とし穴とかいろいろ話してたけど、あとでまとめる。。。
最後にQ&AをBrian Goetzさんと一緒にやって、そのままぐだぐだと終了。
f:id:nowokay:20190730193423j:plain

ということで、Jyukutyoによる終わったのポーズで今日は終了です。 f:id:nowokay:20190730194535j:plain


Vectors and the Numerics on the JVM with Vladimir Ivanov and John Rose

Dinner

参加している日本人5人で、チーズステーキバーガーが食べれるSt. John's Bar&Grillへ
f:id:nowokay:20190730152032j:plain

こんな感じ。ジャンク感!
f:id:nowokay:20190730152121j:plain

今回渡米したメインコンテンツである、skrbさんが写真を撮るところ、も撮れたので満足。 f:id:nowokay:20190730153152j:plain

ということでJVMLS1日目おつかれさまでした。明日のブログはもっと適当に書きます・・・ f:id:nowokay:20190730154220j:plain

Java最新フレームワーク、Helidon、Micronaut、Quarkusをnative-imageまでまとめて試す

最近でてきたフレームワーク、Helidon、Micronaut、Quarkusのクイックスタート、Native-Imageをまとめて試しましょう。

準備

SDKMANインストール

今回はSDKMANで環境を作っていきます。
https://sdkman.io/

コマンドラインで次のコマンドを実行します。Windowsの場合はCygwinかWSLで。

$ curl -s "https://get.sdkman.io" | bash

ターミナルを開きなおすか次のコマンドを実行するとSDKMANが有効になります。

$ source "$HOME/.sdkman/bin/sdkman-init.sh"

JDKインストール

今回はnative-imageまで使うのでGraalVMを使っておきましょう。

$ sdk use java 19.1.0-grl

native-imageの準備も行います。Cygwinではnative-imageはバンドルされているので不要ですが、いまのところ3つのフレームワークのネイティブ化ができてません。

$ gu install native-image

Mavenインストール

HelidonとQuarkusではMavenを使うのでインストールしておきます。

$ sdk install maven

Helidon

HelidonはOracleWebLogicチームが開発しているフレームワークです。
https://helidon.io/

独自APIを使うSEとMicroProfileを使うMPがありますが、現時点でnative-imageに対応しているのはSEのみなので、ここではSEを使います。

プロジェクト作成

archetypeから作成しますが、いろいろ入力するのは面倒なので、候補から選択します。

$ mvn archetype:generate

たくさん候補がでるので、絞り込みます。

...
2450: remote -> xyz.luan.generator:xyz-gae-generator (-)
2451: remote -> xyz.luan.generator:xyz-generator (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1387:

ここでhelidonと入力すると2つに絞られます。

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1387: helidon
Choose archetype:
1: remote -> io.helidon.archetypes:helidon-quickstart-mp (Quickstart archetype for Helidon MP)
2: remote -> io.helidon.archetypes:helidon-quickstart-se (Quickstart archetype for Helidon SE)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): :

2を入力してHelidon SEを選びます。

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 2
Choose io.helidon.archetypes:helidon-quickstart-se version:
1: 0.9.0
...
16: 1.1.1
17: 1.1.2
Choose a number: 17:

そのままenterをおして最新を選びます。
その後、groupIdartifactIdversionpackageを入力します。groupIdは組織名、artifactIdがプロジェクト名です。

Define value for property 'groupId': kis
Define value for property 'artifactId': start-helidon
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' kis: :
Confirm properties configuration:
groupId: kis
artifactId: start-helidon
version: 1.0-SNAPSHOT
package: kis
 Y: : y

artifactIdと同じ名前のディレクトリができているので移動しておきます。

$ cd start-helidon

ビルド

ビルドはMavenで。

$ mvn package

実行

targetにartifactIdと同じ名前のjarファイルができていて、このjarファイルを実行すればサーバーが起動します。

$ java -jar target/start-helidon.jar
[DEBUG] (main) Using Console logging
2019.07.15 07:35:48 INFO io.helidon.webserver.NettyWebServer Thread[main,5,main]: Version: 1.1.2
2019.07.15 07:35:48 INFO io.helidon.webserver.NettyWebServer Thread[nioEventLoopGroup-2-1,10,main]: Channel '@default' started: [id: 0x8985c83f, L:/0:0:0:0:0:0:0:0:8080]
WEB server is up! http://localhost:8080/greet

メッセージどおりhttp://localhost:8080/greetにアクセスするとJSONが返ってきます。
f:id:nowokay:20190715073853p:plain

ネイティブ化

native-imageプロファイルでMavenビルドするとネイティブ化できます。

$ mvn -Pnative-image package

1分ほど待つと、targetディレクトリに実行ファイルができます。

$ target/start-helidon
2019.07.15 07:42:14 INFO io.helidon.webserver.NettyWebServer !thread!: Version: 1.1.2
2019.07.15 07:42:14 INFO io.helidon.webserver.NettyWebServer !thread!: Channel '@default' started: [id: 0xb59ae091, L:/0:0:0:0:0:0:0:0:8080]
WEB server is up! http://localhost:8080/greet

Micronaut

MicroanutはGrailsを作っていたObject Computing社が開発しているフレームワークです。独自APIを使っていて、APIの使いやすさやドキュメントのわかりやすさが魅力。KotlinやGroovyにも対応しています。
https://micronaut.io/

プロジェクト作成

プロジェクト作成にはMicornautのコマンドを使います。これもSDKMANでインストールできます。

$ sdk install micronaut

mnコマンドでプロジェクトを生成します。

$ mn create-app start-mn
Resolving dependencies..
| Generating Java project...
| Application created at /home/naoki/starts/start-mn

プロジェクト名のディレクトリに移動します。

$ cd start-mn

コントローラーは作成されないので、mnコマンドでコントローラーを作成します。

$ mn create-controller MyController

src/main/java/start/mn/MyController.javaが作成されるので少し編集します。

package start.mn;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller // パスを消しておく
public class MyController {
  @Get(produces="TEXT/PLAIN") // 出力メディアタイプを指定
  public String hello() { // 戻り値をStringに
    return "Hello"; // メッセージを返す
  }
}

ビルド

ビルドはGradleを使います。

$ ./gradlew build

> Task :compileJava
Note: Creating bean classes for 1 type elements

BUILD SUCCESSFUL in 8s
10 actionable tasks: 10 executed

実行

build/libsに実行可能jarが作成されているので実行するとサーバーが起動します。

$ java -jar build/libs/start-mn-0.1-all.jar
07:57:32.751 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 1496ms. Server Running: http://localhost:8080

http://localhost:8080にアクセスするとメッセージが表示されます。
f:id:nowokay:20190715075901p:plain

※ 8/13追記 1.2からstart-mn-0.1.jarじゃなくstart-mn-0.1-all.jarになった?

ネイティブ化

Micronautでは特別なネイティブ化コマンドは用意されていないので、native-imageコマンドを直接使います。

$ native-image -jar build/libs/start-mn-0.1-all.jar

カレントディレクトリに実行ファイルが作成されます。

$ ./start-mn-0.1-all
08:03:09.159 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 131ms. Server Running: http://localhost:8080

Quarkus

QuarkusはRed Hatが開発しているフレームワークで、MicroProfileをベースにしています。
https://quarkus.io/

プロジェクト作成

プロジェクト作成にはMavenを使いますが、通常のarchetypeではなく独自プラグインを使います。

$ mvn io.quarkus:quarkus-maven-plugin::create

groupIdartifactIdのほかにRESTリソースを作るかきかれるので、yにしておきます。

$ mvn io.quarkus:quarkus-maven-plugin::create
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- quarkus-maven-plugin:0.19.1:create (default-cli) @ standalone-pom ---
Set the project groupId [org.acme.quarkus.sample]: kis
Set the project artifactId [my-quarkus-project]: start-quarkus
Set the project version [1.0-SNAPSHOT]:
Do you want to create a REST resource? (y/n) [no]: y
Set the resource classname [kis.HelloResource]:
Set the resource path  [/hello]:
Creating a new project in /home/naoki/starts/start-quarkus
...

ビルド

ビルドはMavenでいつもどおり

$ mvn package

実行

targetディレクトリに実行ファイルができるので、javaコマンドで実行することができます。

$ java -jar target/start-quarkus-1.0-SNAPSHOT-runner.jar
2019-07-15 08:25:07,637 INFO  [io.quarkus] (main) Quarkus 0.19.1 started in 0.878s. Listening on: http://[::]:8080
2019-07-15 08:25:07,656 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]

http://localhost:8080/hello にアクセスするとメッセージが表示されます。 f:id:nowokay:20190715082238p:plain

Quarkusの場合、Mavenで実行することでオートリローディングが有効になるので、開発時はこちらを使うほうが便利です。

$ mvn quarkus:dev

ネイティブ化

Quarkusのネイティブ化は、nativeプロファイルを指定してビルドします。

$ mvn -Pnative package

1分ちょい待つとtargetディレクトリに実行ファイルができるので、これを実行するとサーバーが起動します。

$ target/start-quarkus-1.0-SNAPSHOT-runner
2019-07-15 08:31:53,378 INFO  [io.quarkus] (main) Quarkus 0.19.1 started in 0.016s. Listening on: http://[::]:8080
2019-07-15 08:31:53,379 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]

起動時間やメモリの比較

今回はWSL上のUbuntuでの起動時間と利用メモリを比較してみます。
Helidonでは起動時間が表示されていないので、次のような表示コードを追加しておきます。

System.out.println(ManagementFactory.getRuntimeMXBean().getUptime());

起動時間は次のようになります。

GraalVM JDK OpenJDK 12.0.1 native-image
Helidon 864ms 715ms 16ms
Micronaut 1552ms 1387ms 109ms
Quarkus 819ms 720ms 15ms

f:id:nowokay:20190715093023p:plain
ネイティブ化すると圧倒的に起動が速くなってますが、GraalVMよりもOpenJDK 12のほうがかなり速いですね。GraalとC2の違いだと思います。GraalではJavaで書かれているGraal自体をJITするのに時間がかかるので起動は遅くなりがちです。

メモリ使用量は次のような感じに。

GraalVM JDK OpenJDK 12.0.1 native-image
Helidon 233.7MB 64.9MB 7.4MB
Micronaut 344.6MB 95.2MB 15.0MB
Quarkus 246.6MB 81.3MB 6.9MB

f:id:nowokay:20190715092812p:plain

これもネイティブ化するとメモリ使用量が激減してますが、GraalVMよりもOpenJDK 12のほうが少なくなってます。Graalがメモリを使ってるんですかね。