東方算程譚

επιστημηがヨタをこく、弾幕とは無縁のCUDAなタワゴト

Thrust

thrust::for_eachによるヒストグラム

Thrust、個人的にはかなり気に入ってるライブラリなんだけど、なんだか影が薄いんですよね。 cuFFTやcuDNNなどなど、僕らにはとても書けそうにないガチにヘビィな連中とは異なり、Thrustが提供するのは copy/search/sortといった基本的なアルゴリズム群だか…

zip_iteratorによるSoAのソート

ふたつの配列: int x[N], y[N] があって、このふたつを連動してソートしたい、ソート順は「xの小さい順だけど、xが同じときはyの小さい順」...あるある。 CUDA世界ではデータを SoA(Structure of Array)で構成することが多いのでなおさらよくあるシチュエー…

Thrust で 生ポを扱うには

Windows/Visual Studio版ではおなじみの「配列の足し算」: c[i] = a[i] + b[i] (i = 0, 1, ...) を Thrust使って書いてみました。 /* DO NOT FORGET: --expt-extended-lambda option to nvcc */ #include <cstdio> #include <cassert> #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <thrust/transform.h> void add</thrust/transform.h></thrust/device_vector.h></thrust/host_vector.h></cassert></cstdio>…

モンテカルロ法で円周率を求める(改)

さっきのarticle、総計を求めるためだけに thrust::reduce を使いましたけど、Thrustはすっごく便利で使いでがあるんですよ。 たとえば thrust::device_vector<T> は cudaMalloc/cudaFree で取得/解放するデバイス・メモリーが可変長配列であるかのようにふるま</t>…

モンテカルロ法で円周率を求める

二次元平面上、0 < x <= 1, 0 < y <= 1 の領域に、デタラメに点を打ちます。その点と原点(0,0)との距離が1以下であるなら、点は1/4円の内部にあります。 大量の点 (x[i],y[i]) : i = 0, 1...N-1 をデタラメに打ち、1/4円の中に入った点の数をPとすると、P/N …