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.7k
CPUをあたたかくする競プロ事例集
フューチャー社「LT大会#11~冬のぽかぽかテックトーク~」発表資料
Takaaki Sato
February 26, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
XP, Testing and ninja testing ZOZ5
m_seki
3
580
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
400
Serena MCPのすすめ
wadakatu
4
950
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
4
790
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
390
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
330
CSC509 Lecture 06
javiergs
PRO
0
260
NetworkXとGNNで学ぶグラフデータ分析入門〜複雑な関係性を解き明かすPythonの力〜
mhrtech
3
1.2k
チームの境界をブチ抜いていけ
tokai235
0
150
開発生産性を上げるための生成AI活用術
starfish719
3
380
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
250
CSC305 Lecture 05
javiergs
PRO
0
210
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
The Invisible Side of Design
smashingmag
301
51k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
19
1.2k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Mobile First: as difficult as doing things right
swwweet
224
10k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6.1k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
970
Large-scale JavaScript Application Architecture
addyosmani
514
110k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
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. 色々あるけど実力が足りないので使ったことがない