2016-04-29 50 views
3

我想這對專家來說是一個相當容易的問題,但我無法在網上找到任何答案。給定一個簡單的例子:如何用PyCUDA處理python列表?

問題:

listToProcess = [] 
for i in range(0, 10): 
    listToProcess.append(i) 

名單應轉移到GPU上,作進一步處理。然後,我將繼續使用通用的cuda程序進行mem-copy:

import sys 
import pycuda.autoinit 
import pycuda.driver as cuda 

listToProcess_gpu = cuda.mem_alloc(sys.getsizeof(listToProcess)) 
cuda.memcpy_htod(listToProcess_gpu, listToProcess) 

然後調用內核本身。但是列表中沒有緩衝區接口,所以memcpy_htod()崩潰。我嘗試不同的方法太多,但最終它會導致

的問題

  • 一個人怎麼轉移從Python程序到GPU內核中的內容的列表?
  • 如何爲內核指定列表的數據類型(即浮點數,或整數或...)的內核?

回答

1

要做到這一點的唯一方法是創建一個對象,該對象支持列表中的緩衝區協議,並將該新對象傳遞給PyCUDA。在實踐中,這可能意味着建立從列表中numpy的或PyCUDA本地GPUarray陣列和使用,而不是:

import sys 
import pycuda.autoinit 
import pycuda.driver as cuda 
import numpy as np 

listToProcess = [] 
for i in range(0, 10): 
    listToProcess.append(i) 

l2p = np.array(listToProcess, dtype=np.int32) 
listToProcess_gpu = cuda.mem_alloc(l2p.nbytes) 
cuda.memcpy_htod(listToProcess_gpu, l2p) 

這將意味着你的名單是同質相對於打字。具有dtype對象的numpy數組將不起作用。

當然,您可以穿上發襯衫並使用ctypes支持緩衝區協議支持來滾動您自己的對象,但如果PyCUDA本身支持,則可以重新發明輪子。

+0

**提示**:如果傳輸一個浮點數列表,請在Python中使用'dtype = np.float32',在CUDA/Kernel-side使用'float *'。否則,格式化是錯誤的,你不能將實際值分配給數組。 – user3085931