2011-10-04 14 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返回的頁鎖定分配的數組。最直接的方式做到這一點是通過​​:

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 

numpy.ctypes接口可用於獲取一個指針用於固定的陣列數據的存儲,然後ctypes.memmove使用兩種不同的ndarrays之間進行復制。使用裸C指針的所有常見注意事項都適用,因此需要一些謹慎,但它足夠簡單易用。

1

內存塊仍處於活動狀態。您可以明確釋放固定陣列:

print memorypool.active_blocks 
pinnedinput.base.free() 
print memorypool.active_blocks 
memorypool.free_held() 
相關問題