狠狠撸

狠狠撸Share a Scribd company logo
C++ マルチスレッド 入門
KMC 関東例会 (@ Cookpad)
2015/04/24
野島 裕輔
自己紹介
? 野島 裕輔
? KMC ID: nojima
? Github: nojima
? Twitter: nojima
? サイボウズ株式会社でインフラ開発をやっています。
? nginx のパッチを書いて DoS 対策したり
SSL セッションキャッシュをホスト間で共有したり
? サーバクラスタの管理ツールを作ったり
? 矢印が判定????に重なる????????で左の??????を踏むッ!!
ムーアの法則
「集積回路上のトランジスタ数は18ヶ月ごとに倍になる。」
→ プログラマが何もしなくてもソフトウェアは高速になっていった。
http://ja.wikipedia.org/wiki/%E3%83%A0%E3%83%BC%E3%82%A2%E3%81%AE%E6%B3%95%E5%89%87
しかし…
CPU の周波数は 3 GHz ぐらいで頭打ちに
CPU DB: Recording Microprocessor History - ACM Queue
https://queue.acm.org/detail.cfm?id=2181798
ポラックの法則
? 「プロセッサの性能は、そのダイサイズの平方根に比例する」
? Intel のフレッド?ポラックさんの経験則
? 性能を2倍にするには、ダイサイズを4倍にしないといけない。
? それならば、単一のコアの性能は増やさずにコアを4つ積め
ば4倍の性能になるのでは?
CPU のマルチコア化がトレンドに
The Free Lunch Is Over
タダ飯の時代は終わった
Herb Sutter
(Microsoft の偉い人)
マルチコア時代のソフトウェア
? ハードウェアの進化を享受するためには、複数コアを上手く利
用できるようにプログラムを書く必要がある。
? マルチプロセス化
? データを共有する必要がないか、少数のデータしか共有しなくていい
場合は複数のプロセスを立ち上げて、プロセス間通信などでデータを
共有するのが安全。
? マルチスレッド化
? 多くのデータを共有する場合は、メモリ空間を共有して複数スレッドを
実行するのが効率的。
? 今回の講座ではマルチスレッドを扱う。
C++ とマルチスレッド
? C++11 から言語にマルチスレッドのサポートが入った。
? これにより環境依存のライブラリを利用しなくても、
C++ の標準ライブラリだけでマルチスレッドなプログラムが
書けるようになった。
? しかも、わりと使い勝手がよい。
これさえあれば、だれでも簡単に
マルチスレッドプログラミングが……!!
これさえあれば、だれでも簡単に
マルチスレッドプログラミングが……!!
\______ _______________________/
○
O ????
o
∧_∧! ??! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
___( ゜?゜)_ < という夢を見たんだ
| 〃( つ つ | \________
|\ ⌒⌒⌒⌒⌒⌒\
| \^ ⌒ ⌒ \
\ |⌒⌒⌒⌒⌒⌒ |
\|________|
現実
? マルチスレッドプログラミングは罠だらけ。
? とりあえず罠を知ろう。
読み書きの競合
2つのスレッドで x++ を実行
read x
calc x + 1
write x
x = 0
x = 1
read x
calc x + 1
write xx = 2
読み書きの競合
2つのスレッドで x++ を実行
read x
calc x + 1
write x
x = 0
x = 1
read x
calc x + 1
write xx = 1
読み書きの競合
2つのスレッドで x++ を実行
read x
calc x + 1
write x
x = 0
x = 1
read x
calc x + 1
write xx = 1
タイミングによって最終結果が異なる
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
y
200
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
y
200
x
0
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
y
200
x
0
x → y という順番で書き込んだはずなのに、y の値しか読めていない!!
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
bool done = false; // global variable
double ans = 0.0; // global variable
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
コンパイラ先生
「ループ一周ごとに !done を
評価するのは無駄では?」
bool done = false; // global variable
double ans = 0.0; // global variable
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
if (!done) {
while (true)
/* busy loop */;
}
cout << ans << endl;
コンパイラ先生
「最適化しといたで!!!」
bool done = false; // global variable
double ans = 0.0; // global variable
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
if (!done) {
while (true)
/* busy loop */;
}
cout << ans << endl;
コンパイラ先生
「最適化しといたで!!!」
無限ループ!!
bool done = false; // global variable
double ans = 0.0; // global variable
我々はいったいどうすればいいのか?
? 間違った解決策:
? 全ての変数に volatile をつける
? volatile にデータ競合を防ぐ力はない
? 全ての変数を atomic テンプレートでくるむ
? できない
? プログラム全体を lock で囲う
? マルチスレッドとは…
? コードを書いて神に祈る
? 日頃の行いに依る
http://nonylene.net/blog/2014-12/dendengu.html
我々はいったいどうすればいいのか?
? 間違った解決策:
? 全ての変数に volatile をつける
? volatile にデータ競合を防ぐ力はない
? 全ての変数を atomic テンプレートでくるむ
? できない
? プログラム全体を lock で囲う
? マルチスレッドとは…
? コードを書いて神に祈る
? 日頃の行いに依る
http://nonylene.net/blog/2014-12/dendengu.html
まずはメモリモデルを知ろう
この講座は
? マルチスレッドプログラミングを安全に行うために
必要なメモリモデルの概念を紹介する
? メモリモデルとは、メモリへの読み書きがどういう性質を満たすべきかを
記述したもの。
? 时间の制约上、色々端折ってたり误魔化したりしているので注意。
用語
? オブジェクト
? 規格上の定義は region of storage.
? メモリ上に固有の領域を持っている存在。
? 変数とか配列の要素とか一時オブジェクトとか。
? 評価
? 式の値を計算したり、式の副作用を発動させたりすること。
? 一つの式が複数回評価されたり、一回も評価されなかったりする。
? 例えば、以下のプログラムの場合、x = 42 は 10 回評価される。
? for (int i = 0; i < 10; ++i)
x = 42;
happens before
? 評価と評価の間には、happens before 関係という半順序関
係が定義されている。
? 直感的には、A happens before B とは、B が始まる前に必ず
A が完了していることを表す。
? happens before は半順序関係なので、グラフ的には DAG
で表現できる。
x = 0
x y = 1
z = 3 y
happens before
? 同じスレッド上で実行される評価の間には、
自明な順序で happens before が定義される。
? たまに例外もあるが…
? 異なるスレッド上で実行される評価の間には、
特別なことがない限り happens before は成り立たない。
? どういう場合に成り立つかは後述。
data race
? 2 つの評価 A, B が以下の4条件を満たすとき、
プログラムに data race があるという。
1. A, B が同一の非アトミックオブジェクトに対する操作
2. A, B の少なくとも一方が書き込み操作
3. A happens before B でない
4. B happens before A でない
? プログラムに data race があるとき、undefined behavior
が起こる。
data race
bool done = false; // global variable
double ans = 0.0; // global variable
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
? 同一の非アトミックオブジェクトに対する操作
? 一方は書き込み操作
? お互いに happens before でない
data race
bool done = false; // global variable
double ans = 0.0; // global variable
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
? 同一の非アトミックオブジェクトに対する操作
? 一方は書き込み操作
? お互いに happens before でない
undefined behavior
atomic
? アトミックオブジェクトは data race を起こさない特別な
オブジェクト。
? std::atomic<T> で T 型のアトミック版が手に入る。
? 例:
? std::atomic<int> // アトミックな int
? std::atomic<void*> // アトミックな void*
? なんでもアトミックにできるわけではなく、T は trivially
copyable なものに制限されている。
? つまり、T はユーザ定義のコピーコンストラクタ、ムーブコンストラクタ、
代入演算子、デストラクタを持てない。
atomic
std::atomic<int> x; // 0 で初期化される
x.store(42); // x に 42 を書き込む
cout << x.load() << endl; // x の値を読む
x.fetch_add(1); // 値を 1 増やす
cout << x.load() << endl; // 43 が出力される
// x == y ならば x に 100 を代入 (いわゆるCAS)
int y = 43;
x.compare_exchange_strong(y, 100);
atomic と happens before
アトミックオブジェクト M に対する書き込み操作 W と
M に対する読み込み操作 R があるとする。
もし R が W の書き込んだ値を読んだとすると、
W happens before R が成り立つ。
(このとき W synchronizes with R という)
※ memory_order が relaxed や consume でない場合
atomic と happens before
std::atomic<bool> done = false; // global variable
double ans = 0.0; // global variable
// Thread 1
ans = complex_computation();
done.store(true);
// Thread 2
while (!done.load())
/* busy loop */;
cout << ans << endl;
? atomic 変数を使うことにより、done に関する data race を解消。
? done の store-load により、ans の書き込みと ans の読み込みの
間にも happens before 関係が入る。
atomic と happens before
ans = complex_computation();
done.store(true);
done.load()
done.load()
done.load()
done.load()
cout << ans << endl;
同一スレッドなので
happens before
synchronize!!
同一スレッドなので
happens before
atomic と happens before
ans = complex_computation();
done.store(true);
done.load()
done.load()
done.load()
done.load()
cout << ans << endl;
同一スレッドなので
happens before
synchronize!!
同一スレッドなので
happens before
mutex
? std::atomic<T> では、一回の store や fetch_add など
をアトミックに実行できる。
? しかし、実際にはもっと複雑な計算をアトミックにやらないとい
けない場合が多い。
? std::mutex を使えば、lock() してから unlock() する
までの間を排他処理することができる。
? つまり、lock() から unlock() までの間を複数のスレッドが同時に実
行しないことを保証できる。
mutex
map<string, string> pages; // global variable
mutex pages_mutex; // global variable
void save_page(const string& url) {
result = (url にアクセスして内容を取得);
pages_mutex.lock(); // 例外安全性はとりあえず置いておく
pages[url] = result;
pages_mutex.unlock();
}
int main() {
// 並列にウェブサイトをクロール
thread t1(save_page, "http://foo");
thread t2(save_page, "http://bar");
t1.join(); t2.join();
}
ロックしてるから安全?
string* pHello = nullptr; // global variable
mutex mtx; // global variable
// singleton() は複数のスレッドから並列に呼ばれる
void singleton() {
// double-checked locking pattern のつもり
if (pHello == nullptr) {
mtx.lock(); // とりあえず例外安全性には目をつぶる
if (pHello == nullptr)
pHello = new string("Hello");
mtx.unlock();
}
// シングルトンなオブジェクトへのアクセス
cout << *pHello << endl;
}
ロックしてるから安全?
string* pHello = nullptr; // global variable
mutex mtx; // global variable
// singleton() は複数のスレッドから並列に呼ばれる
void singleton() {
// double-checked locking pattern のつもり
if (pHello == nullptr) {
mtx.lock(); // とりあえず例外安全性には目をつぶる
if (pHello == nullptr)
pHello = new string("Hello");
mtx.unlock();
}
// シングルトンなオブジェクトへのアクセス
cout << *pHello << endl;
}
undefined
behavior
mutex と happens before
? 単一の mutex に対する lock(), unlock() はある全順序 S
に従って起こる。
? スレッドA, B, C, D があるときに、スレッド A から見て C → D の順で
ロックを取ったように見えたとしたら、B から見ても C → D の順でロック
を取ったように見える。
? U をある mutex に対する unlock 操作、
L を同じ mutex に対する lock 操作とする。
このとき、S の上で U < L ならば U happens before L である。
ロックしてるから安全?(再掲)
string* pHello = nullptr; // global variable
mutex mtx; // global variable
// singleton() は複数のスレッドから並列に呼ばれる
void singleton() {
// double-checked locking pattern のつもり
if (pHello == nullptr) {
mtx.lock(); // とりあえず例外安全性には目をつぶる
if (pHello == nullptr)
pHello = new string("Hello");
mtx.unlock();
}
// シングルトンなオブジェクトへのアクセス
cout << *pHello << endl;
}
undefined
behavior
happens before 関係を図示すると…
pHello == nullptr
mtx.lock()
pHello == nullptr
pHello = new string(..)
mtx.unlock()
cout << *pHello << endl
pHello == nullptr
cout << *pHello << endl
happens before 関係を図示すると…
pHello == nullptr
mtx.lock()
pHello == nullptr
pHello = new string(..)
mtx.unlock()
cout << *pHello << endl
pHello == nullptr
cout << *pHello << endl
happens before 関係を図示すると…
pHello == nullptr
mtx.lock()
pHello == nullptr
pHello = new string(..)
mtx.unlock()
cout << *pHello << endl
pHello == nullptr
cout << *pHello << endl
実際、pHello が読めた
としても、pHello が指す
先が読めるとは限らない。
直し方
直し方はいろいろある。
1. pHello の型を atomic<string*> にする。
? こうすると、 pHello.store(new string(...)) と
pHello.load() == nullptr の間に happens before 関係が入る。
2. double-checked locking pattern を使わずに、いきなり
lock する。
? mtx.unlock() happens before mtx.lock() となるので OK。
3. Mayers' singleton を使う。
まとめ
? 非アトミックなオブジェクトに対して、互いに happens before
関係にない読み書きが発生すると data race。
? 同じスレッド上の評価は自明な順番で happens before 関係
が入る。
? 同一のアトミックオブジェクトに対する store と load は条件を
満たすと happens before 関係を作る。
? 同一の mutex に対する unlock と lock は条件を満たすと
happens before 関係を作る。
参考文献
? Working Draft, Standard for Programming Language C++
https://github.com/cplusplus/draft
? cppreference.com
http://cppreference.com/

More Related Content

What's hot (20)

PDF
中3女子でもわかる constexpr
Genya Murakami
?
PPTX
Map
kikairoya
?
PPT
Glibc malloc internal
Motohiro KOSAKI
?
PDF
ゲーム開発者のための C++11/C++14
Ryo Suzuki
?
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
?
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
?
PDF
c辞苍蝉迟别虫辫谤関数はコンパイル时処理。これはいい。実行时が霞んで见える。肠辫耻の娇声が闻こえてきそうだ
Genya Murakami
?
PDF
いまさら闻けない!颁鲍顿础高速化入门
Fixstars Corporation
?
PPTX
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
Yuki Miyatake
?
PDF
暗号技术の実装と数学
MITSUNARI Shigeo
?
PDF
モジュールの凝集度?结合度?インタフェース
Hajime Yanagawa
?
PDF
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
?
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
?
PDF
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
?
PDF
明日使えないすごいビット演算
京大 マイコンクラブ
?
PDF
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
PDF
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
?
PDF
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
?
PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
PDF
例外设计における大罪
Takuto Wada
?
中3女子でもわかる constexpr
Genya Murakami
?
Glibc malloc internal
Motohiro KOSAKI
?
ゲーム開発者のための C++11/C++14
Ryo Suzuki
?
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
?
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
?
c辞苍蝉迟别虫辫谤関数はコンパイル时処理。これはいい。実行时が霞んで见える。肠辫耻の娇声が闻こえてきそうだ
Genya Murakami
?
いまさら闻けない!颁鲍顿础高速化入门
Fixstars Corporation
?
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
Yuki Miyatake
?
暗号技术の実装と数学
MITSUNARI Shigeo
?
モジュールの凝集度?结合度?インタフェース
Hajime Yanagawa
?
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
?
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
?
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
?
明日使えないすごいビット演算
京大 マイコンクラブ
?
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
?
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
?
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
例外设计における大罪
Takuto Wada
?

Similar to C++ マルチスレッド 入門 (20)

PPTX
非同期処理の基础
信之 岩永
?
PPTX
笔贬笔とシグナル、その里侧
do_aki
?
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
?
PDF
Effective modern-c++#9
Tatsuki SHIMIZU
?
PDF
Swift 2.0 て?変わったところ「後編」 #cswift
Tomohiro Kumagai
?
ODP
Boost9 session
freedom404
?
PDF
What is Metasepi?
Kiwamu Okabe
?
PDF
SystemC Tutorial
kocha2012
?
PDF
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews, Inc.
?
PPT
Altanative macro
Motohiro KOSAKI
?
PDF
Project Loom - 限定継続と軽量スレッド -
Yuichi Sakuraba
?
PDF
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
?
PPTX
final int をFINAL しやがれ!
Keiichi Nagaoka
?
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
?
KEY
Objc lambda
matuura_core
?
PDF
Intel TSX HLE を触ってみた x86opti
Takashi Hoshino
?
PDF
狈辞诲别.箩蝉入门
俊夫 森
?
PDF
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
Fumiya Nozaki
?
PPT
尝濒でゆるふわプログラミングのすすめ
mizcki
?
PDF
スタート低レイヤー #0
Kiwamu Okabe
?
非同期処理の基础
信之 岩永
?
笔贬笔とシグナル、その里侧
do_aki
?
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
?
Effective modern-c++#9
Tatsuki SHIMIZU
?
Swift 2.0 て?変わったところ「後編」 #cswift
Tomohiro Kumagai
?
Boost9 session
freedom404
?
What is Metasepi?
Kiwamu Okabe
?
SystemC Tutorial
kocha2012
?
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews, Inc.
?
Altanative macro
Motohiro KOSAKI
?
Project Loom - 限定継続と軽量スレッド -
Yuichi Sakuraba
?
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
?
final int をFINAL しやがれ!
Keiichi Nagaoka
?
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
?
Objc lambda
matuura_core
?
Intel TSX HLE を触ってみた x86opti
Takashi Hoshino
?
狈辞诲别.箩蝉入门
俊夫 森
?
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
Fumiya Nozaki
?
尝濒でゆるふわプログラミングのすすめ
mizcki
?
スタート低レイヤー #0
Kiwamu Okabe
?
Ad

More from 京大 マイコンクラブ (20)

PDF
テキストファイルを読む? 第1回
京大 マイコンクラブ
?
PDF
かわいくなろうとしたら语汇力が下がった话
京大 マイコンクラブ
?
PDF
Common Lisp入門
京大 マイコンクラブ
?
PDF
多倍长整数の乗算と高速フーリエ変换
京大 マイコンクラブ
?
PDF
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
?
PDF
Geometry with Unity
京大 マイコンクラブ
?
PDF
セミコロンレス肠++
京大 マイコンクラブ
?
PDF
エンジニアと健康
京大 マイコンクラブ
?
PPTX
女の子になれなかった人のために
京大 マイコンクラブ
?
PDF
笔颈别迟で竞プロしよう
京大 マイコンクラブ
?
ODP
もし太阳のコアが滨苍迟别濒颁辞谤别だったら
京大 マイコンクラブ
?
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
?
PDF
プログラムを高速化する話Ⅱ ?GPGPU編?
京大 マイコンクラブ
?
PDF
ドット絵でプログラミング!难解言语『笔颈别迟』勉强会
京大 マイコンクラブ
?
PDF
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
?
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
?
PPTX
hideya流 テストプレイ観察術
京大 マイコンクラブ
?
PDF
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
?
PDF
C#でゲームを作る2016 第8回
京大 マイコンクラブ
?
テキストファイルを読む? 第1回
京大 マイコンクラブ
?
かわいくなろうとしたら语汇力が下がった话
京大 マイコンクラブ
?
多倍长整数の乗算と高速フーリエ変换
京大 マイコンクラブ
?
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
?
Geometry with Unity
京大 マイコンクラブ
?
セミコロンレス肠++
京大 マイコンクラブ
?
エンジニアと健康
京大 マイコンクラブ
?
女の子になれなかった人のために
京大 マイコンクラブ
?
笔颈别迟で竞プロしよう
京大 マイコンクラブ
?
もし太阳のコアが滨苍迟别濒颁辞谤别だったら
京大 マイコンクラブ
?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
?
プログラムを高速化する話Ⅱ ?GPGPU編?
京大 マイコンクラブ
?
ドット絵でプログラミング!难解言语『笔颈别迟』勉强会
京大 マイコンクラブ
?
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
?
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
?
hideya流 テストプレイ観察術
京大 マイコンクラブ
?
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
?
C#でゲームを作る2016 第8回
京大 マイコンクラブ
?
Ad

Recently uploaded (9)

PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
PDF
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
?
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
?
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
?
PDF
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
?
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
?
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
?
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
?
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
?
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?

C++ マルチスレッド 入門