最小限のコードであまり落ちてなかったので自分のメモ用としても
まずはCUDA版(nvccでコンパイルするやつ)
つぎにPyCUDA版(2020.1)
ほんの19行でかけた aにCPUからもGPUからもアクセスできている。
まずは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からもアクセスできている。








