pycodaでのデュアルGPUの使用
プログラムの都合上、パソコンの2つのGPUを同時にオンにして計算する必要があり、下は2つのGPUをオンにする方法です.
まず、いくつかの概念を知っておく必要があります.
同じ時間、1つのcpuの下のプロセスには1つのdevice、すなわちGPUしかありませんが、device上で行われるメモリ割り当てなどの操作には1つのcontextが管理される必要があります.
そこで,CPUの下でマルチプロセスを用いて異なるデバイスを開くことを考えた.次はテストコードです.
pycodaの下で2つの方法でdevice操作を行い、
1つ目はimport pycoda.autoinitに渡すことです.
2 2つ目は手動で開くことです.
まず、いくつかの概念を知っておく必要があります.
同じ時間、1つのcpuの下のプロセスには1つのdevice、すなわちGPUしかありませんが、device上で行われるメモリ割り当てなどの操作には1つのcontextが管理される必要があります.
そこで,CPUの下でマルチプロセスを用いて異なるデバイスを開くことを考えた.次はテストコードです.
import pycuda
from pycuda import gpuarray
import pycuda.driver as cuda
from pycuda.compiler import SourceModule
import threading
import numpy
import time
class GPUThread(threading.Thread):
def __init__(self, number, some_array):
threading.Thread.__init__(self)
self.number = number
self.some_array = some_array
def run(self):
self.dev = cuda.Device(self.number)
self.ctx = self.dev.make_context()
self.array_gpu = gpuarray.to_gpu(self.some_array)
uuout = test_kernel(self.array_gpu)
print("device name is:",self.dev.name())
print ("successful exit from thread:" ,self.getName())
self.ctx.pop()
del self.array_gpu
del self.ctx
def test_kernel(input_array_gpu):
mod = SourceModule("""
__global__ void f(float * out, float * in)
{
int idx = threadIdx.x;
out[idx] = in[idx] + 6;
}
""")
func = mod.get_function("f")
output_array_gpu = gpuarray.zeros((64,), numpy.float32)
func(output_array_gpu,
input_array_gpu,
block=(64, 1, 1), grid=(1,1))
uuout = output_array_gpu.get()
return uuout
cuda.init()
some_array = numpy.full((64,), 1).astype(numpy.float32)
num = cuda.Device.count()
gpu_thread_list = []
start_time = time.time()
for i in range(num):
gpu_thread = GPUThread(i, some_array)
gpu_thread.start()
gpu_thread_list.append(gpu_thread)
for i in gpu_thread_list:
i.join()
pycodaの下で2つの方法でdevice操作を行い、
1つ目はimport pycoda.autoinitに渡すことです.
2 2つ目は手動で開くことです.
import pycuda
import pycuda.driver as cuda
cuda.init()
num = cuda.Device.count()
self.dev = cuda.Device(num)
self.ctx = self.dev.make_context()//
self.ctx.pop()//