2011-10-04 2 views
1

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() 

답변

3

당신은 당신의 소스 배열에서 데이터를 복사해야합니다 pycuda에서 반환 된 페이지 잠김 할당을 유지하는 배열. 이를위한 가장 간단한 방법은 ctypes를 통해 경우 : numpy.ctypes 인터페이스는 배열의 데이터를 저장하는 데 사용되는 메모리에 대한 포인터를 가져올 수 있습니다, 다음 ctypes.memmove 두 개의 서로 다른 ndarrays 사이에 복사하는 데 사용

import numpy 
import ctypes 

x=numpy.array([1,2,3,4],dtype=numpy.double) 
y=numpy.zeros_like(x) 

source = x.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) 
dest = y.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) 
sz = x.size * ctypes.sizeof(ctypes.c_double) 

ctypes.memmove(dest,source,sz) 

print y 

. 알몸의 C 포인터로 작업하는 모든 일반적인주의 사항이 적용되므로주의가 필요하지만 사용하기에 충분합니다.

1

메모리 블록이 여전히 활성 상태입니다. 고정 된 배열을 명시 적으로 해제 할 수 있습니다.

print memorypool.active_blocks 
pinnedinput.base.free() 
print memorypool.active_blocks 
memorypool.free_held() 
관련 문제