Nerves の可能性は IoT だけじゃない(前編)〜ElixirとPelemayで世界の消費電力を抑える

この記事は[「#NervesJP Advent Calendar 2019」](https://qiita.com/advent-calendar/2019/nervesjp)12日目の記事です。

昨日は @torifukukaiou さんの[「Nervesを使って毎朝天気予報をRaspberry Pi 2にしゃべらせる(できた！)」](https://qiita.com/torifukukaiou/items/795ee5a112845dbf7730)でした。

前回は[「CPU Info を開発している時にわかった Nerves 対応のコツ」](https://qiita.com/zacky1972/items/ad2fa8ce816bc83c0c61)をお送りしました。

今回は技術的ポエムです。2回に分けて，Nerves の IoT 以外の可能性について論じたいと思います。

# スライド

[![slide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/9ad19330-78b7-65eb-9f53-0cc29ffb43be.png)
](https://speakerdeck.com/zacky1972/di-qiu-wen-nuan-hua-toelixir)

# 突然ですが地球温暖化の話をします

下記の講演をご覧になったことはありますか？

[<img width="645" alt="スクリーンショット 2019-12-06 11.00.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/ebff949f-3deb-a34e-4c62-0c9c8dc37c58.png">](https://youtu.be/vtPnsH_ZdSA)

実に怒りに満ちたメッセージです。この活動家，グレタ・トゥーンベリ Greta Thunberg さんに対する批判は，世の中に数多くあることは私も承知しています。好き嫌いで言うと嫌いな人も多いでしょう。これだけ激しいメッセージを送っているのですから，反発する人が多いということだと思います。

しかし注目すべきなのは，背後にある事実としてのデータです。地球温暖化，すなわち気温や海水温が上昇しているということについて，依然として懐疑的な人が存在しますが，地球温暖化が起こっているというエビデンスは数多く上がっています。

グレタさんの言うように，10年で二酸化炭素の排出量を半減できた場合に，気温上昇が1.5℃以下に収まる可能性は50％です。1℃や2℃の気温・海水温の変化など，大したことがないと思う人もいるかもしれません。しかし，南極やグリーンランドなどの氷河が溶けて海水面が上昇します。気候変動に関する政府間パネル(IPCC)「第5次評価報告書」によると，1901-2010年の約100年の間に19cm海面が上昇しました。21世紀中に最大82cm上昇すると予測されています。環境省地球温暖化問題検討委員会 温暖化影響評価ワーキングループ「地球温暖化の日本への影響2001」によると，日本では1m海面が上昇すると日本全国の砂浜の9割以上が失われると予測されています。

もう一度書きますが，10年で二酸化炭素の排出量を半減できた場合に，気温上昇が1.5℃以下に収まる可能性は50％です。前提条件として二酸化炭素の排出量が半減できることが上がっていますし，半減できた場合でも1.5℃以上気温が上昇する確率は50％あるのです。[United Nations Climate Action Summit New York, 22 September 2019 のレポート](https://www.ipcc.ch/2019/09/22/united-in-science-report-climate-summit/)によれば，300〜500万年前には二酸化炭素濃度が400ppmで，現在よりも2〜3℃気温が高く，10〜20m海水面が上昇していました。そして恐ろしいことに2018年の二酸化炭素濃度は407.8ppmに達していて，2017年と比べて2.2ppm上昇しています。2019年には410ppmを超える見込みです。

300〜500万年前と同じ二酸化炭素濃度の水準なのに気温や海水面の上昇がそこまで達していないのは，何か地球が寒冷化している理由があるのかもしれませんが，単に平衡状態になっていないだけなのかもしれません。[現在，このように穏やかな**気候変化**(climate change: 長期的な気候の変化)にとどまっているのは，地球温暖化で発生した熱を海洋が90％も吸収しているからです。海洋が溜め込んでいる熱量は2019年には実に228ZJ(ゼタジュール)に達しています。](https://rdcu.be/b0jVv) すなわち，長い年月この二酸化炭素濃度を保っていると，同じくらいの気温・海水面上昇になるのかもしれません。[なお，最悪ケースでは2100年までに二酸化炭素濃度が1200ppm，8℃もの気温上昇，60mもの海水面上昇になるだろうという予測すらあります。](https://thinkprogress.org/worst-case-global-warming-uninhabitable-earth-c25cd97007fe/) 

海洋がこれだけの熱量を溜め込んでいることで，**気候変動**(climate variability: 短期的な気候の変動)に大きく影響しています。近年異常気象が叫ばれることが多いと思いませんか？ [それは地球温暖化によって海洋に溜め込まれた熱量によって，水蒸気の量が増えたり，海流が変化したりすることで，気候が大きく変動してしまうからです。](https://www.iucn.org/resources/issues-briefs/ocean-warming)異常気象によって災害が多く発生してしまい，莫大な損失を生んでいます。

気温上昇・異常気象ということでいうと，[夏の最高気温・最低気温が年々上昇していることを実感していると思います。現在の日本の夏の最高気温の記録は41℃台で，生命の危険がある状況です。](https://www.data.jma.go.jp/obd/stats/etrn/view/rankall.php?fbclid=IwAR2_ilPEEtEj_RQXozhbyaWnUGak_OfWdlbL6EZ-GMSmuhbSZGo5H9kxTM8)これが常態化すると，夏の昼に外に出歩くと死亡するリスクが出てきます。とくに電気・ガス・水道等のインフラストラクチャを整備する人が外で作業できないということになると，経済に大きな支障が出てきます。砂漠地帯のように，夏の間は夜に活動するというようなことになるかもしれません。

問題は二酸化炭素だけではありません。南極の氷の奥底にはメタンガスが閉じ込められているという学説が有力です([ナショナル・ジオ・グラフィックの日本語記事](https://natgeo.nikkeibp.co.jp/nng/article/news/14/6654/)，[英語記事](https://www.nationalgeographic.com/news/2012/8/120831-antarctica-methane-global-warming-science-environment/)。[記事中で紹介されているNatureの記事はこれと思われます。Wadham, J., Arndt, S., Tulaczyk, S. et al. Potential methane reservoirs beneath Antarctica. Nature 488, 633–637 (2012) doi:10.1038/nature11374 ](https://www.nature.com/articles/nature11374?platform=hootsuite))。メタンガスの温室効果は，二酸化炭素よりも大きいです。IPCC第4次評価報告書によれば，二酸化炭素に比べメタンは25倍の温室効果をもたらすということです。もし地球温暖化の進行により，南極大陸の氷の中に閉じ込められているメタンガスが大量に放出されるという事態になると，地球温暖化は急加速することでしょう。先ほどの最悪ケースの予測には，南極大陸のメタンガスの大量放出の可能性は考慮に入っていないでしょうから，本当の最悪ケースはもっとひどい状況になる可能性があります。

最近の研究では，金星は30億年以上に渡って地球と同様に水が存在するような惑星であったが，7億年前の大規模な火山活動により二酸化炭素が激増して，現在のような約90気圧，460℃もの高温高圧の惑星になったというシミュレーション結果が発表されています。

[Michael J. Way and Anthony D. Del Genio: A view to the possible habitability of ancient Venus over three billion years,  Vol. 13, EPSC-DPS2019-1846-1, 2019 EPSC-DPS Joint Meeting 2019. available at https://meetingorganizer.copernicus.org/EPSC-DPS2019/EPSC-DPS2019-1846-1.pdf](https://meetingorganizer.copernicus.org/EPSC-DPS2019/EPSC-DPS2019-1846-1.pdf)

金星同様に，地球上に人間が住めなくなるというシナリオは，現実のものになろうとしているのかもしれません。そうなるのはまだ先だとしても，気候変動・異常気象による自然災害により，多くの人々が死傷したり，苦しんだりしています。グレタさんの怒りは，そう間違っていないことだと言えます。

# コンピュータと地球温暖化

コンピュータと地球温暖化は決して無縁ではありません。

英語ではありますが，下記の論文をぜひご覧ください。

[A. Andrae & T. Edler: On Global Electricity Usage of Communication Technology: Trends to 2030, Challenges 2015, 6(1), 117-157. available at https://www.mdpi.com/2078-1547/6/1/117](https://www.mdpi.com/2078-1547/6/1/117)

これには次のような驚くべきことが書かれています。

* コンピュータデバイスにかかる電力消費量は，2030年時点の最悪ケースで世界の電力供給量の50%にも及ぶ可能性がある
*  中でも固定網やデータセンターの電力消費量が伸びる可能性が高い 

5Gの普及，機械学習などの計算量の増大などにより，インフラストラクチャー側の負荷が急上昇するというシミュレーション結果が描かれています。

考慮すべきなのは，コンピュータの電力消費量は，これからも伸びるのは確実だということです。最悪の場合は，繰り返しますが，全電力供給量の50％もの電力をコンピュータが消費するということになります。

この驚くべき量の電力は，基本的には全て熱として大気中に排出されます。もちろん，電力を生み出すために二酸化炭素が相当量排出されます。コンピュータが地球温暖化の問題に無縁のはずがありません。

# コンピュータの消費電力を抑えるためにソフトウェアでできること

有名なヘネシー＆パターソンのコンピュータアーキテクチャの教科書(いわゆるヘネパタ本)には，トランジスタの消費する電力は，電圧の2乗とトランジスタ数とクロック周波数の積に比例すると書かれています。

また，高いクロック周波数で動作させようと思うと，電圧を上げる必要が出てきます。電圧が低いと，原理上，トランジスタのスイッチをオンオフするのに長い時間かかるからです。したがって，クロック周波数を低く抑えて，必要最小限の電圧に抑えることが，トランジスタの消費電力を抑えるのにとても効果的です。

クロック周波数を抑えてもCPUの計算能力を維持・向上させるには，どのようにしたらいいでしょうか？ ソフトウェアで解決するためには，大きく3つアプローチがあります。

* **目的を達成するのに必要なクロック数を削減する。**このためには，無駄な命令を実行しないことが肝要です。**コンパイル・最適化されたネイティブコード**で実行する方が，最適化されていないインタプリタ実行よりも，同じことをするのに必要な電力消費を抑えられます。
* **並列処理を最大限に生かして計算能力を高め，かつできるだけ同期・排他制御で計算が停止しないようにする。**コアが複数ある場合，1つのコアだけに処理を集中させてクロック周波数を上げて処理するよりも，複数のコアに処理を分散させてクロック周波数を下げた方が，消費電力あたりの計算能力を向上させることが容易です。
* **使わないモジュールのクロックを停止するなど電源コントロールをこまめに行うようにする。**使わないモジュールのクロックを停止すれば，理想的にはそのモジュールの消費電力を0にできます。実際には待機電力があるので，少し消費しますけどね。組込みソフトウェアではこの辺りをかなり頑張っていますね。

# Elixirで消費電力の問題に貢献できること

![Immutable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/19d49f12-2b68-94e0-0714-ea935f1f2d9c.png)

上図をご覧ください。共有メモリモデル，すなわち複数のコアでデータを共有していると仮定します(左上図)。従来のプログラミング言語では，データを破壊的更新しながら計算が進行します。そのため，あるコアが共有データを更新すると，他のコアにデータの更新を通知する必要があります。この時にコアでの処理を一時的に止める必要があります(同期・排他制御)。コア数が多くなれば多くなるほど，この影響が深刻になります。この様子を右上図に示しています。

Elixir の特徴は**イミュータブル性**です。Elixirでは完全にイミュータブルなので，破壊的更新が発生しません。そうすると，他のコアやプロセスに変更を通知する必要がなくなるので，同期・排他制御を大幅に減らすことができます。そのため，コア数が多くなっても，スピードが遅くなることがありません。この様子を示したのが，上図の中の下の図です。

したがって，**Elixirでは，並列処理を最大限に生かして計算能力を高め，かつできるだけ同期・排他制御で計算が停止しないようにすることができます。**これにより，消費電力あたりの計算能力を大きく高めることが期待できます。

# Pelemayで消費電力の問題に貢献できること

前述のようにElixirでは，並列処理を最大限に生かして計算能力を高め，かつできるだけ同期・排他制御で計算が停止しないようにすることができますが，インタプリタによる実行であるため，「目的を達成するのに必要なクロック数を削減する」という観点では改善の余地が多々あります。

そこで，私たちが研究開発中の[Pelemay](https://github.com/zeam-vm/pelemay)です。Pelemayは，最終的にはElixirのネイティブ最適化コンパイラになることを目指しています。**Pelemayにより，並列処理を最大限に生かして計算能力を高め，かつできるだけ同期・排他制御で計算が停止しないようにすることができる**だけでなく，ネイティブコードに最適化コンパイルすることで**目的を達成するのに必要なクロック数を削減することができます。**これにより，消費電力あたりの計算能力をさらに大きく高めることが期待できます。

# 前編のまとめ

ElixirとPelemayにより，計算能力を維持・向上しつつ，コンピュータの消費電力を大きく抑えることができる可能性を見出すことができました。これにより地球温暖化の問題にどのくらい貢献できるかというのは，Elixirのさらなる普及と，今後の研究開発次第だと考えています。地球温暖化の抑止に貢献するくらいのインパクトを与えるためには，既存の並列化・ネイティブコード化されていないシステムを，全てElixirベースに置き換えるくらい，ドラスティックな取り組みをする必要があるかもしれません。

明日は[「Nerves の可能性は IoT だけじゃない(後編)〜Nervesで世界の消費電力を抑える」](https://qiita.com/zacky1972/items/ebdf9b3f048256b90c52)です。お楽しみに。