我想通過ctypes使用python來控制cuda。在這裏,爲了說明我的問題,我使用python將指針傳遞給分配cuda內存的c函數,將numpy數組複製到cuda mempory,並將cuda內存複製回新的numpy數組。但它似乎沒有工作,儘管我的基本ctypes設置工作。我認爲問題是從cudaMalloc函數返回到python。在cuda上使用python句柄與ctypes分配內存
這裏的Python代碼
pycu_alloc = dll.alloc_gpu_mem
pycu_alloc.argtypes = [c_size_t]
pycu_alloc.restypes = [c_void_p]
host2gpu = dll.host2gpu
host2gpu.argtypes = [c_void_p, c_void_p, c_size_t]
gpu2host = dll.gpu2host
gpu2host.argtypes = [c_void_p, c_void_p, c_size_t]
a = np.random.randn(1024).astype('float32')
c = np.zeros(1024).astype('float32')
c_a = c_void_p(a.ctypes.data)
c_c = c_void_p(c.ctypes.data)
da = pycu_alloc(1024)
c_da = c_void_p(da)
host2gpu(c_a, c_da, 1024)
gpu2host(c_c, c_da, 1024)
print a
print c
和C:
extern "C" {
float * alloc_gpu_mem(size_t N)
{
float *d;
int size = N *sizeof(float);
int err;
err = cudaMalloc(&d, size);
printf("cuda malloc: %d\n", err);
return d;
}}
extern "C" {
void host2gpu(float * a, void * da, size_t N)
{
int size = N * sizeof(float);
int err;
err = cudaMemcpy(da, a, size, cudaMemcpyHostToDevice);
printf("load mem: %d\n", err);
}}
extern "C"{
void gpu2host(float *c, void *d_c, size_t N)
{
int err;
int size = N*sizeof(float);
err = cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);
printf("cpy mem back %d\n", err);
}}
代碼應該隨機向量a
複製到CUDA內存,然後複製CUDA內存回空載體c
。當我打印c
時,認爲它只是0
s。
我已經與float*
和void*
不同的可能性摔跤,特別是在alloc_gpu_mem
的作品。但我不知道該怎麼做。
對於err
返回值,該cudaMalloc
回報0
但兩者cudaMemcpy
回報11
什麼蟒蛇做錯誤的指針?幫幫我?
這並不直接回答你的問題,但是......您是否嘗試過[AndreasKlöckner](http://mathema.tician.de/software/pycuda/)的現有Python CUDA綁定(我認爲這與Nvidia從其網站鏈接的是相同的,但是我沒有檢查)? – abarnert
不,我正在看那個,我可能應該使用它們,但我想潛入並控制自己的cuda,以確保我知道發生了什麼。那麼我就抓住了自己的蟒蛇手柄,因爲它對我來說真的很棒。可惜。 – Ethan