SlideShare a Scribd company logo
1 of 39
Download to read offline
マーク&スイープ勉強会
七誌
マーク&スイープ
• GCのアルゴリズムの一種
• GC中はプログラムが停止する
– これはstop the worldと呼ばれる
• 停止時間を短くするために色々な工夫がある
– 世代別GC、Concurrent GCなど
• これらはマーク&スイープの発展系
• 今回は基礎となる単純なマーク&スイープに
的を絞る
今回の流れ
• 単純なマーク&スイープGCを実装する
• 対象はシングルスレッドに限定
– マルチスレッドは単純なマーク&スイープでは対
応できないため、前のスライドで取り上げたような
発展系のアルゴリズムが必要
• 大まかに説明した後、実装のための自由時
間とします
– 自由時間を長めに取りたいので、説明はざっくり
– 自由時間に質問を受け付けます。お気軽に!
第1部
メモリを覗いてみよう
ローカル変数 (1)
• まず次のようなケースで、使用しなくなったポ
インタをどう検出するか考える
#include <stdlib.h>
int main() {
void *a = malloc(10);
void *b = malloc(10);
a = NULL;
}
2. 宙に浮く
1. ポインタを上書き
ローカル変数 (2)
• メモリ管理やポインタについて調べる前に、
ローカル変数がメモリにどう格納されている
のかを確認する
#include <stdio.h>
int main() {
int a = 0x12345678, b = 0xcafebabe;
printf("&a: %p¥n", &a);
printf("&b: %p¥n", &b);
}
&a: 0028FF1C
&b: 0028FF18
実行結果
ローカル変数 (3)
• デバッガで見てみる
入力
スタックフレーム (1)
• ローカル変数周りのメモリは、大まかに以下のよう
な構造になっている
• この構造をスタックフレームと呼ぶ
アドレス
小
大
(ワークエリア)
ローカル変数
(ワークエリア)
引数
スタックフレーム (2)
• ローカル変数より引数のアドレスが大きいこ
とを確認してみる
#include <stdio.h>
int main(int argc, char *argv[]) {
int a;
printf("&a : %p¥n", &a);
printf("&argc: %p¥n", &argc);
printf("&argv: %p¥n", &argv);
}
&a : 0028FF1C
&argc: 0028FF30
&argv: 0028FF34
実行結果
スタックフレーム (3)
• 関数を呼び出すと、スタックフレームはどんどん上
(アドレスの小さい方)に積み重なる
アドレス
小
大
void b() {
}
void a() {
b();
}
b() の
スタックフレーム
a() の
スタックフレーム
a() から b() を呼ぶ
スタックフレーム (4)
• 関数を呼び出すとスタックフレームが上に積
み重なることを確認してみる
#include <stdio.h>
int b(int a) {
printf("&a : %p¥n", &a);
}
int main(int argc, char *argv[]) {
printf("&argc: %p¥n", &argc);
b(0);
}
&argc: 0028FF30
&a : 0028FF10
実行結果
変数探し
• スタックフレームを走査して変数を検出
#include <stdio.h>
void search(int *start, int value) {
for (int *p = start; p > &value; p--) {
if (*p == value) {
printf("found: %p¥n", p);
return;
}
}
}
int main(int argc, char *argv[]) {
int a = 0xcafebabe;
printf("&a: %p¥n", &a);
search(&argc, a);
}
&a: 0028FF1C
found: 0028FF1C
実行結果
malloc (1)
• 冒頭の問題に戻る
#include <stdlib.h>
int main() {
void *a = malloc(10);
void *b = malloc(10);
a = NULL;
}
• malloc() の戻り値を記録しておいて、スタック
フレームに含まれるか確認すれば良い
malloc (2)
• malloc() の戻り値を記録する例
#include <stdlib.h>
#include <map>
static std::map<void *, bool> mallocs;
void *gc_malloc(size_t size) {
void *ret = malloc(size);
mallocs[ret] = true;
return ret;
}
問題 1
• 以下のコードで使われている gc_init(),
gc_malloc(), gc_collect() を実装してください。
• ※ 最初に掲示した問題を改変しました。
#include <stdlib.h>
int main(int argc, char *argv[]) {
gc_init(&argc);
void *a = gc_malloc(10);
void *b = gc_malloc(10);
a = NULL;
gc_collect();
}
問題 1 の回答例
static void **stack_start;
void gc_init(int *pargc) {
stack_start = reinterpret_cast<void **>(pargc);
}
void gc_collect() {
void *end;
for (auto it = mallocs.begin(); it != mallocs.end(); ++it)
it->second = false;
for (auto p = stack_start; p > &end; p--)
if (mallocs.find(*p) != mallocs.end())
mallocs[*p] = true;
for (auto it = mallocs.begin(); it != mallocs.end();)
if (it->second) ++it; else {
free(it->first);
mallocs.erase(it++);
}
}
マーク&スイープ
問題 1 の回答例について説明
1. mallocsの値をすべてfalseにする
2. スタックフレームを走査して、見付けたもの
をtrueにする
3. falseのままになっている領域を解放する
2のフェーズをマーク、3をスイープと呼ぶ
保守的なGC
• 偶然 mallocsに含まれるのと同じ値がメモリ
に含まれている可能性がある。
• その場合、解放されないまま残る。
• GCが誤って解放し過ぎるとアクセスしたとき
に落ちるが、解放されずに残っても多少リー
クする程度で実害はない。
• そのように割り切ったGCを『保守的なGC』と
呼ぶ。
第2部
ポインタを追ってみよう
問題 2
• 生きている領域が解放されないようにGCを
修正してください。
#include <stdlib.h>
struct Test { void *ptr; };
int main(int argc, char *argv[]) {
gc_init(&argc);
Test *t = reinterpret_cast<Test *>(
gc_malloc(sizeof(Test)));
t->ptr = gc_malloc(10);
gc_collect();
} 生きているのに
回収されてしまう!
問題 2 の回答例(抜粋)
struct HeapInfo { size_t size, sizep; bool marked; };
static std::map<void *, HeapInfo> mallocs;
void *gc_malloc(size_t size) {
void *ret = malloc(size);
HeapInfo hi = { size, size / sizeof(void *), true };
mallocs[ret] = hi;
return ret;
}
static void gc_scan(void **start, void **end) {
for (auto p = start; p < end; p++) {
auto it = mallocs.find(*p);
if (it != mallocs.end() && !it->second.marked) {
it->second.marked = true;
auto pp = reinterpret_cast<void **>(*p);
gc_scan(pp, pp + it->second.sizep);
}
}
}
問題 3
• 無駄なスキャンを抑制してください。
struct Test { void *ptr; int *buf; };
int main(int argc, char *argv[]) {
gc_init(&argc);
Test *t = reinterpret_cast<Test *>(
gc_malloc(sizeof(Test)));
t->ptr = gc_malloc(10);
t->buf = reinterpret_cast<int *>(
gc_malloc(1024 * 1024));
gc_collect();
} ポインタが含まれていない
内部の走査は無駄!
問題 3 の回答例(抜粋)
• 内部を走査するか指定できるようにする
struct HeapInfo { size_t size, sizep; bool marked, scan; };
void *gc_malloc(size_t size, bool scan = true) { 略 }
static void gc_scan(void **start, void **end) {
略
it->second.marked = true;
if (it->second.scan) { 略 }
略
}
int main(int argc, char *argv[]) {
略
t->buf = reinterpret_cast<int *>(
gc_malloc(1024 * 1024, false));
gc_collect();
}
第3部
C++で使いやすく
new (1)
• 以前出てきた例を改めて見返すと・・・
#include <stdlib.h>
struct Test { void *ptr; };
int main(int argc, char *argv[]) {
gc_init(&argc);
Test *t = reinterpret_cast<Test *>(
gc_malloc(sizeof(Test)));
t->ptr = gc_malloc(10);
gc_collect();
} いくら何でも冗長過ぎる!
newで簡単に書けないか?
new (2)
• operator newを置き換えると無条件にGC対
象となってしまうため、意図的にGCを外した
いときに不便
• newした後、GCに登録する関数を用意
• 常にGC対象にしたいクラスはコンストラクタ
で自分を登録すれば良い
Test *t = gc_register(new Test);
struct Test {
Test() { gc_register(this); }
};
new (3)
• deleteで解放するため、解放処理をコール
バックとして登録できるようにする
• free() と同じ型の関数ポインタで登録するた
め、delete のラッパーを用意
template <class T> void gc_delete(void *p) {
delete reinterpret_cast<T *>(p);
}
template <class T> void gc_delete_array(void *p) {
delete [] reinterpret_cast<T *>(p);
}
実装例(抜粋)
struct HeapInfo {
size_t size, sizep; bool marked, scan;
void (*free)(void *);
};
void gc_register(void *p, size_t size, bool scan,
void (*free)(void *)) {
HeapInfo hi = { size, size / sizeof(void *),
true, scan, free };
mallocs[p] = hi;
}
void *gc_malloc(size_t size, bool scan = true) {
void *ret = malloc(size);
gc_register(ret, size, scan, free);
return ret;
}
template <class T> T *gc_register(T *t) {
gc_register(t, sizeof(T), true, gc_delete<T>);
return t;
}
GCポインタ (1)
• グローバル変数や非GC対象インスタンスのメンバ
は走査対象とならない
int *p = gc_new<int>();
struct Test { int *ptr; };
int main(int argc, char *argv[]) {
gc_init(&argc);
Test *t = new Test;
t->ptr = gc_new<int>();
gc_collect();
}
生きているのに
回収されてしまう!
GCポインタ (2)
• スマートポインタと同じような発想でGCポイン
タを作ってマーク対象とする
gc_ptr<int> p = gc_new<int>();
struct Test { gc_ptr<int> ptr; };
int main(int argc, char *argv[]) {
gc_init(&argc);
Test *t = new Test;
t->ptr = gc_new<int>();
gc_collect();
}
実装例(抜粋)
static std::list<void **> gc_ptrs;
template <class T> class gc_ptr {
T *ptr;
std::list<void **>::iterator it;
void init(T *p) {
ptr = p;
gc_ptrs.push_back(reinterpret_cast<void **>(&ptr));
it = --gc_ptrs.end();
}
public:
gc_ptr() { init(NULL); }
gc_ptr(const gc_ptr<T> &p) { init(p.ptr); }
gc_ptr(T *p) { init(p); }
~gc_ptr() { gc_ptrs.erase(it); }
gc_ptr<T> &operator =(T *p) { ptr = p; return *this; }
inline operator T *() const { return ptr; }
};
クロージャ (1)
• C++のラムダ式はキャプチャによって環境を
閉じ込めているわけではないため、厳密には
クロージャではないと言われる
• 以下の例ではローカル変数をキャプチャして
いるが、単なる参照のため、スコープアウト後
に使用してはいけない
std::function<int()> test() {
int a = 0;
return [&] { return ++a; };
}
クロージャ (2)
• GCがあれば、キャプチャ対象を気軽にヒープ
に確保することができる
std::function<int()> test() {
gc_ptr<int> a = gc_new<int>();
*a = 0;
return [=] { return ++(*a); };
}
int main() {
auto f = test();
printf("%d¥n", f());
gc_collect();
printf("%d¥n", f());
f = [] { return 0; };
gc_collect();
printf("%d¥n", f());
}
ここでキャプチャされた
aが指す先が解放される
クロージャ (3)
• ヒープを使う方式は、ローカル変数のキャプ
チャに参照を使う F# と同じ構造
• ヒープへのポインタを値束縛することで、環境
を閉じ込めたように見せかけている
std::function<int()> test() {
gc_ptr<int> a = gc_new<int>();
*a = 0;
return [=] { return ++(*a); };
}
C++ with GC
let test () =
let a = ref 0
fun () -> a := !a + 1; !a
F#
第4部
自動調節
閾値 (1)
• 今までは手動で gc_collect を呼んでいた
• GCに登録するときに使用メモリ量をカウント
して、閾値を超えたら呼ぶことで自動化
static size_t mem_used;
static size_t threshold = 1024 * 1024;
void gc_register(void *p, size_t size, bool scan,
void (*free)(void *)) {
HeapInfo hi = { size, size / sizeof(void *),
true, scan, free };
mallocs[p] = hi;
mem_used += size;
if (mem_used > threshold) gc_collect();
}
閾値 (2)
• スイープの際に使用メモリ量を減らす
• 最終的に確定した使用量で閾値を調整
void gc_collect(void *dummy) {
略
for (auto it = mallocs.begin(); it != mallocs.end();) {
if (it->second.marked) ++it; else {
printf("sweep: %p¥n", it->first);
(*it->second.free)(it->first);
mem_used -= it->second.size;
mallocs.erase(it++);
}
}
while (mem_used > (threshold >> 1))
threshold <<= 1;
}
閾値 (3)
• 自動的に gc_collect() が呼ばれるようになる
int main(int argc, char *argv[]) {
gc_init(&argc);
for (int i = 0; i < 10; i++)
gc_malloc(300 * 1024, false);
}
• 処理内容によってGCの特性は異なる
– 巨大なサイズが少数確保される場合
– 小さいサイズが大量に確保される場合
• サイズや個数も考慮すると効率が上がる
ご清聴ありがとうございました

More Related Content

What's hot

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOGame Tools & Middleware Forum
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解したtorisoup
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unity Technologies Japan K.K.
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものRecruit Lifestyle Co., Ltd.
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 

What's hot (20)

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 

Viewers also liked

Cコンパイラの改造(未)
Cコンパイラの改造(未)Cコンパイラの改造(未)
Cコンパイラの改造(未)7shi
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク7shi
 
GCについて
GCについてGCについて
GCについてcactusman
 
お絵描きソフト「PaintField」の開発
お絵描きソフト「PaintField」の開発お絵描きソフト「PaintField」の開発
お絵描きソフト「PaintField」の開発seanchas_t
 
F#とトランスレータ
F#とトランスレータF#とトランスレータ
F#とトランスレータ7shi
 
無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発7shi
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続7shi
 
Exploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC CloudExploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC CloudRyousei Takano
 
[学内勉強会]C++11とdirectxライブラリ
[学内勉強会]C++11とdirectxライブラリ[学内勉強会]C++11とdirectxライブラリ
[学内勉強会]C++11とdirectxライブラリShota Homma
 
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~Ryousei Takano
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装Takuya ASADA
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作uchan_nos
 
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングエクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングegtra
 

Viewers also liked (17)

Cコンパイラの改造(未)
Cコンパイラの改造(未)Cコンパイラの改造(未)
Cコンパイラの改造(未)
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
GCについて
GCについてGCについて
GCについて
 
GCが止まらない
GCが止まらないGCが止まらない
GCが止まらない
 
お絵描きソフト「PaintField」の開発
お絵描きソフト「PaintField」の開発お絵描きソフト「PaintField」の開発
お絵描きソフト「PaintField」の開発
 
F#とトランスレータ
F#とトランスレータF#とトランスレータ
F#とトランスレータ
 
無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
 
Rcppのすすめ
RcppのすすめRcppのすすめ
Rcppのすすめ
 
Exploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC CloudExploring the Performance Impact of Virtualization on an HPC Cloud
Exploring the Performance Impact of Virtualization on an HPC Cloud
 
[学内勉強会]C++11とdirectxライブラリ
[学内勉強会]C++11とdirectxライブラリ[学内勉強会]C++11とdirectxライブラリ
[学内勉強会]C++11とdirectxライブラリ
 
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
クラウドの垣根を超えた高性能計算に向けて~AIST Super Green Cloudでの試み~
 
ELF
ELFELF
ELF
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作
 
Qt小技(修正版)
Qt小技(修正版)Qt小技(修正版)
Qt小技(修正版)
 
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングエクストリームC++11/14プログラミング
エクストリームC++11/14プログラミング
 

Similar to マーク&スイープ勉強会

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for cmiura1729
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部NVIDIA Japan
 
普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in RubyAkito Sano
 
PBL1-v1-007j.pptx
PBL1-v1-007j.pptxPBL1-v1-007j.pptx
PBL1-v1-007j.pptxNAIST
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告Ikumi Shimizu
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
PBL1-v1-008j.pptx
PBL1-v1-008j.pptxPBL1-v1-008j.pptx
PBL1-v1-008j.pptxNAIST
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Takahiro Harada
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 

Similar to マーク&スイープ勉強会 (20)

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby
 
PBL1-v1-007j.pptx
PBL1-v1-007j.pptxPBL1-v1-007j.pptx
PBL1-v1-007j.pptx
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
出張 CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ 成果報告
 
N3495 inplace realloc
N3495 inplace reallocN3495 inplace realloc
N3495 inplace realloc
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
PBL1-v1-008j.pptx
PBL1-v1-008j.pptxPBL1-v1-008j.pptx
PBL1-v1-008j.pptx
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 

More from 7shi

F#談話室(3) LT
F#談話室(3) LTF#談話室(3) LT
F#談話室(3) LT7shi
 
ZIP勉強会
ZIP勉強会ZIP勉強会
ZIP勉強会7shi
 
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)7shi
 
Deflate
DeflateDeflate
Deflate7shi
 
CRC-32
CRC-32CRC-32
CRC-327shi
 
LLPML
LLPMLLLPML
LLPML7shi
 

More from 7shi (6)

F#談話室(3) LT
F#談話室(3) LTF#談話室(3) LT
F#談話室(3) LT
 
ZIP勉強会
ZIP勉強会ZIP勉強会
ZIP勉強会
 
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
 
Deflate
DeflateDeflate
Deflate
 
CRC-32
CRC-32CRC-32
CRC-32
 
LLPML
LLPMLLLPML
LLPML
 

マーク&スイープ勉強会