仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

PyCUDA

CUDA Unified Memoryを扱う方法 (CとPyCUDAのコード)

最小限のコードであまり落ちてなかったので自分のメモ用としても

まずはCUDA版(nvccでコンパイルするやつ)
#include <stdio.h>
__global__ void VecAdd(float* A, float* B, float* C) {
	int id = 256 * blockIdx.x + threadIdx.x;
	C[id]=A[id]+B[id];
}

int main() {
	int N = 1024;
	// Allocate 3 arrays on GPU
	float *d_A, * d_B, * d_C;
	cudaMallocManaged(&d_A, N * sizeof(float));
	cudaMallocManaged(&d_B, N * sizeof(float));
	cudaMallocManaged(&d_C, N * sizeof(float));
	// CPU init
	for(int i=0;i<N;i++){
		d_A[i]=d_B[i]=1.0*i;
	}

	//gpu kernel
	VecAdd <<<N/256, 256>>> (d_A, d_B, d_C);
	cudaDeviceSynchronize();//wait

	for(int i = 0;i<N;i++){
		printf("%f ",d_C[i]);
	}
	
	cudaFree(d_A);
	cudaFree(d_B);
	cudaFree(d_C);
	return 0;
}

つぎにPyCUDA版(2020.1)
from pycuda.autoinit import context
import pycuda.driver as cuda
from pycuda.compiler import SourceModule
import numpy as np

mod = SourceModule("""
__global__ void doublify(float *a)
{
    a[threadIdx.x] *= 2;
}
""")
doublify = mod.get_function("doublify")

a = cuda.managed_empty(shape=12, dtype=np.float32, mem_flags=cuda.mem_attach_flags.GLOBAL)
a[:] = np.linspace(0, 11, len(a)) # Fill array on host
doublify(a, grid=(1,1), block=(len(a),1,1))
context.synchronize() # Wait for kernel completion before host access
print(a)
del a #これでガベージコレクションに削除してもらうことで、GPUメモリも解放される

ほんの19行でかけた aにCPUからもGPUからもアクセスできている。

PyCUDA導入メモ

せっかくNVIDIAグラボが入っているPCが手に入ったのでPyCUDAで遊ぼうかと

環境
OS:Windows 10
CPU:core i7 8700k
RAM:32GB
GPU:GTX 1080


導入手順

Visual Studio 2017 community版をインストール


最新のcuda tool kit (cuda_10.0.130_411.31_win10)
をAll Install

最新のAnaconda 5.3(Python 3.7)
をAll Userにインストール
・Add Anaconda to the system PATH environment variable
・Register Anaconda as the system Python 3.7
の両方にチェックが入っていることを確認(多分片方チェックが外れている)

3-1
インストールできたか確認
cmd(コマンドプロンプト)でpythonと打ちpython 3.7 ::Anaconda・・・がでればOK

cmdを管理者権限で実行
pip install pycuda
でpycudaをインストール

4-1
cmdを開いて
pythonと打ちimport pycuda
ができるか確認

4-2
次にpythonでテストプログラム
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy
a_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print(a_doubled)
print(a_gpu)
ができるか確認。おそらく今の状態だとcl.exeのパスが通っていなくエラーがでるはず


cl.exeのパスを通す
環境変数のPATHに以下を追加
『C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64』

5-1
確認
cmdでclと打ち
Microsoft(R) C/C++ Optimizing Compiler Version・・・とでればパスが通っている

5-2
もう一回pythonでテストプログラム
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy
a_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print(a_doubled)
print(a_gpu)
おそらく大量のWarningがでるがErrorはでないはず
→できた!(終了)
→やはりできない。この場合グラボのドライバをアップデートすることで私の場合は解決した。GPU-ZでCUDAにチェックが入っているか再度確認を


Warningの消し方・・・
よくわからんがまぁ動いているからヨシ!(分かったら追記します)
プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ