フィックスターズの短期インターンに参加してきました

f:id:yuji9511yuji:20190528003303p:plain:w500
こんにちは、すぎやんです。
5月の平日2週間で株式会社フィックスターズのインターンに参加してきました!
実際の業務の一部を手伝わせていただいたので詳しい内容は書くことができないのですが、作業をしてみた感想などをまとめていきたいと思います。

きっかけ

フィックスターズを知ったきっかけはAtCoder Jobsでした。様々ある企業からここを選んだ理由としては色々あるのですが

  • 短期でのインターンでもOKだったこと(研究室とか色々忙しかったので長期は避けたかった)
  • 水色コーダーでも申し込める条件だった
  • ある程度時給がよかった(これ大事)

などが大きいですね。まだサマーインターンの時期としては早かったのですが、この時期にやっておくのも面白いかなと思ってエントリーしました。
ちなみにこの時期のインターンは穴場らしく、サマーインターンの時期と比べて応募者が少ないので合格率が高いらしいです。予定がつく人にはおすすめです。

面接とか

書類審査に通ったあと、本社がある大崎で面接を行いました。通常の面接を行なった後、コーディングテストなるものを行いました。具体的な内容などは書くことができませんが、競プロをしてる皆さんなら解けますよね、みたいな問題が出ました。たぶんAtCoder Jobsで水色以上という敷居を乗り越えている人たちなら大丈夫な問題だと思います。
ライブコーディングは初めてだったので少し緊張しました。普段書いているテキトーなコードがリアルタイムでみられてると思うと恥ずかしいものがありました。

インターンでやった内容

無事合格をいただき、2週間のインターンが開始しました。平日週5日とはいっても、どうしても外せない授業などの時間は空けるなどの柔軟な時間調整をしてもらったのでありがたかったです。
2週間という短期間なので導入部分はざっくりと済ませ、いきなり実際の業務の内容に触れる形となりました。

今回のテーマは「DSPをターゲットとしたSIMD高速化」でした。DSPとはDigital Signal Processorであり、低電力、低コストながらも高速な演算の実行が可能なマイクロプロセッサです。SIMDとはSingle Instruction Multiple Dataのことで、1つの命令で複数のデータに関して演算を行う手法のことです。一度に演算を実行したい要素数(16や32になることが多い)をメモリの連続した領域に割り当て、適切な命令を実行することで演算が行われます。この演算は実行するDSPの種類によって変わってくるため、どのような結果を返すどういった命令が存在するかをレファレンス等で都度参照する必要があります。

f:id:yuji9511yuji:20190527233242p:plain:w500
Intelのページより引用

上の図は8つの演算を並列実行する操作のイメージです。このような要素のひとまとまりをベクトルと呼びます。ベクトルは全体のサイズが決まっていて、要素1つのサイズによって要素数が決定します。例えば、512bitsのベクトルにおいて1要素がint16_tであれば32要素、uint_8型であれば64要素となります。
このSIMDを用いることで定数倍の高速化を実現することが可能となります。競プロでいうとbitset高速化がこの感覚に近いでしょうか。アルゴリズム的な高速化はもう行えない場合などにこの並列化を実装してよりパフォーマンスを高めることが多いそうです。

このSIMD化を用いてとある関数の高速化を行いました。SIMD化する前と後でクロック数にして20分の1程度の差が出たことから、SIMD化によってこの関数の処理がかなり高速化されたことがわかります。

感想とか

まず、SIMDなど比較的低いレイヤーにおける開発の経験がなかったため、はじめに状況を理解するのにとても苦しみました。インターン前にSIMDとは何か、みたいなQiitaのまとめ記事を軽く読んだ程度の知識しかなかったのでほぼはじめて学ぶような状況でした。
また、今回用いる命令セットがAVX-512のような有名なものではなく、検索しても解説記事がほとんど出てこないようなマイナーなものだったため、わからない事柄の調査にとても苦戦しました。公式レファレンスをゴリゴリ読み解く力みたいなのはつきましたね。

またオフィスの雰囲気はエンジニアが多い環境だなと実感しました。たとえお昼休憩でもみんな自分の好きな技術の話で議論を交わしていて、たくさんの強いエンジニアが一堂に会するとこういう環境になるんだなーと思いました。社内の勉強会も見学させてもらったのですが、とてもレベルの高い話し合いが行われていていい刺激になりました。

今回の作業を通して低レイヤーの開発に興味が湧きました。コンパイラの最適化やアセンブラのことなど、今までやったことのない分野に触れてみるいいきっかけになった気がします。友人に組み込みOS自作入門なるものを薦められたので時間があるときに購入して挑戦してみたいなーなどと思っています。

おわりに

別にAtCoderのまわしものではないですがAtCoder Jobsでのマッチングは素晴らしいと思います。実際、同時にインターン開始した3人全員がJobsからの応募でした。競プロで培った力を何か実務に生かしてみたいと考えている人は興味のある企業を見つけて応募してみるといいと思います。
jobs.atcoder.jp

また、夏のエンジニア向けインターンは以下の有名なスプレッドシートにもまとまっています。有名企業のインターンはだいたい網羅されている気がするので併せて参照してみるといいと思います。
docs.google.com

それでは。