pycodaでのデュアルGPUの使用


プログラムの都合上、パソコンの2つのGPUを同時にオンにして計算する必要があり、下は2つのGPUをオンにする方法です.
まず、いくつかの概念を知っておく必要があります.
  同じ時間、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()//