Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CPUをあたたかくする競プロ事例集
Search
Takaaki Sato
February 26, 2021
Programming
1
1.8k
CPUをあたたかくする競プロ事例集
フューチャー社「LT大会#11~冬のぽかぽかテックトーク~」発表資料
Takaaki Sato
February 26, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
410
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
430
2026年は Rust 置き換えが流行る! / 20260220-niigata-5min-tech
girigiribauer
0
230
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
140
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
230
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
400
Ruby x Terminal
a_matsuda
7
590
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
480
How to stabilize UI tests using XCTest
akkeylab
0
110
CSC307 Lecture 14
javiergs
PRO
0
470
AI時代のソフトウェア開発でも「人が仕様を書く」から始めよう-医療IT現場での実践とこれから
koukimiura
0
140
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
410
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
The Cult of Friendly URLs
andyhume
79
6.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The Cost Of JavaScript in 2023
addyosmani
55
9.8k
Context Engineering - Making Every Token Count
addyosmani
9
740
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Six Lessons from altMBA
skipperchong
29
4.2k
How GitHub (no longer) Works
holman
316
140k
Ruling the World: When Life Gets Gamed
codingconduct
0
170
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
130
Transcript
CPUをあたたかくする 競プロ事例集 佐藤尭彰
自己紹介 ◦ 佐藤 尭彰 (たかあき) ◦ 競技プログラミングで Future から計 7
万円 貰った
自己紹介 ◦ 佐藤 尭彰 (たかあき) ◦ 競技プログラミングで Future から計 7
万円弱貰った ◦ HTTF 19’ 6万 ◦ HTTF 21’ 1万 賞金が給与扱いになって税金が引かれた
競技プログラミングとは? ◦ くわしくは前回の LT 大会を見ましょう 2021/2/26 https://future-architect.github.io/articles/20200923/
競技プログラミングとは? (アルゴ限定) ◦2 秒で答えを出すためにアルゴリズムレベルで最適化をする ◦ そのためなら、 ジャッジを壊す以外 何をやってもいい ◦ 何をやってもいい
テーマ ◦ぽかぽかテックトーク ◦「あたたかい話」 ◦CPUを極限まで あたたかく できる、 競プロ界の「王道」「邪道」たちを紹介
あたたか度 ☆ ◦ Bit をいっぱい扱いたい ◦ 言語にもよるが、真偽値型は 1 byte (以上)
を専有する ◦ C# とかは int 並に 4 byte 持っていく ◦ 0・1の 2 値なら 1 bit でいいはず std::bitset<N> ◦ C++における、N bit のビット列を効率的に扱う仕組み ◦ [] でアクセスできて == で等値比較ができてビット演算子が定義済 ◦ べんり!
王道はここまで
あたたか度 ☆☆ ◦ 数値をいっぱい扱いたい ◦ 言語にもよるが、浮動小数点型は 8 byte を専有する ◦
今どき 32bit float がデフォルトの言語ってあるんですかね…? ◦ そんな時、何を使えばいいでしょうか?
あたたか度 ☆☆ ◦ SIMD化 ◦ 1命令で複数の数に同じ処理を行ったり行わなかったりできる ◦ 強制的な定数倍高速化でCPUをあたたかくする ◦ 幾つかのジャッジは
AWS 上で動いているので AVX512 まで使える ◦ とてもあたたかい
あたたか度 ☆☆ ◦ GCCだと非常に簡単 #pragma GCC optimize ("Ofast") #pragma GCC
target ("avx512f") ◦ あとは素直な for 文を書く
実際にやってみた ◦ABC033D 三角形の分類 ◦ N (< 2000) 個の平面座標格子点のうち任意の 3 点で三角形を作る。
それが鈍角・直角・鋭角三角形のどれになるかを分類して数をカウントし、 それぞれの個数を出力せよ。 ただし任意の 3 点は同一直線上にない (= 3 点を選べば必ず三角形ができる)。 ◦ O(N^3) 時間では間に合わなさそうな制約
実際にやってみた ◦O(N^3) 解法 本当は通らないはずの嘘解法 ◦ {鈍角, 直角, 鋭角}三角形となるかどうかは、内角が最大の頂点に依存する → min(cos
α, cos β, cos γ) の符号が {負, 0, 正} になっていればよい。 → 各辺をベクトルと見て、角を挟む2辺の内積を取ればOK ( |a||b| > 0 は符号に関係ないので無視できる ) ◦ N(N-1)(N-2)/6 個の全組合せに対して調べる https://gakuen.gifu-net.ed.jp/~contents/museum/vector/page120_3.html
実際にやってみた ◦ 提出 https://atcoder.jp/contests/abc033/submissions/20473077 https://atcoder.jp/contests/abc033/submissions/20473067
他の言語におけるSIMD ◦ Python だと numpy を利用すれば SIMD が効く (ことが多い) ◦
特に行列演算なら (Open)BLAS が裏で動くので速い ◦ たまに出る行列累乗系の問題は SIMD を考慮しない制約が付いているので、 ほかにも行列演算が早い言語なら雑に書いても許される • はやい • 書きやすい • 起動に1秒かかる ←ぽんこつ
◦ さて
あたたか度 ☆☆☆ ◦ SIMD化すごい ◦ 手動でも書きたくなりませんか
あたたか度 ☆☆☆☆ ◦ intrinsic ◦ GCC には SIMD 命令を呼べる built-in
関数がある https://www.officedaytime.com/simd512/
あたたか度 ★★★★★★★★★★★★ ◦ intrinsic ◦ なんと AtCoder でもちゃんと使える ◦ 去年の言語アップデートでしれっと使えるようになったらしい
◦ これでもう asm に頼らなくてもいい!! ◦ SIMD を手動実装して圧倒的成長!
実際にやってみた いつもの SIMD召喚の呪文
実際にやってみた いつもの SIMD召喚の呪文 遅くなりました https://atcoder.jp/contests/abc033/submissions/20488733
制約を見直す ◦ -10,000 ≦ x_i, y_i ≦ 10,000 ◦ 各辺の座標の差は
2 万以下 ◦ int16_t ◦ VPMADDWD https://www.officedaytime.com/simd512/simdimg/si.php?f=pmaddwd
実際にやってみた いつもの 8/16bit 召喚の呪文
実際にやってみた いつもの 8/16bit 召喚の呪文 勝利!! https://atcoder.jp/contests/abc033/submissions/20496215
みんなも SIMD をつかって、 想定解法外のゴリ押し CPUをあたたかく しよう!
ご清聴ありがとうございました ◦ Q. SIMD以外のゴリ押しはないのか ◦ A. 色々あるけど実力が足りないので使ったことがない