PyCUDA help explains how to create an empty or zeroed array 그러나 기존의 numpy 배열을 페이지 잠김 메모리로 이동하는 (?) 방법은 없습니다. numpy 배열에 대한 포인터를 가져와 pycuda.driver.PagelockedHostAllocation
에 전달해야합니까? 그리고 어떻게 그럴 수 있을까요?PyCUDA의 기존 numpy 어레이에서 페이지 - 락 메모리를 생성하는 방법은 무엇입니까?
UPDATE
< --sniped ->
업데이트 2 개
덕분에 당신이 도움을 talonmies. 이제 메모리 transfare 페이지 잠금하지만 프로그램은 다음과 같은 오류로 종료 :
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuMemFreeHost failed: invalid context
이 업데이트 된 코드는 다음과 같습니다
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import ctypes
from pycuda import driver, compiler, gpuarray
from pycuda.tools import PageLockedMemoryPool
import pycuda.autoinit
memorypool = PageLockedMemoryPool()
indata = np.random.randn(5).astype(np.float32)
outdata = gpuarray.zeros(5, dtype=np.float32)
pinnedinput = memorypool.allocate(indata.shape,np.float32)
source = indata.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
dest = pinnedinput.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
sz = indata.size * ctypes.sizeof(ctypes.c_float)
ctypes.memmove(dest,source,sz)
kernel_code = """
__global__ void kernel(float *indata, float *outdata) {
int globalid = blockIdx.x * blockDim.x + threadIdx.x ;
outdata[globalid] = indata[globalid]+1.0f;
}
"""
mod = compiler.SourceModule(kernel_code)
kernel = mod.get_function("kernel")
kernel(
driver.In(pinnedinput), outdata,
grid = (5,1),
block = (1, 1, 1),
)
print indata
print outdata.get()
memorypool.free_held()