2013-11-02 43 views
2

我正在使用pyopencl加速我的計算使用GPU,並在目前神祕的下列問題。pyopencl分配錯誤與for循環中的簡單乘法

進出口使用下面的代碼

import numpy as np 
import pyopencl as cl 
import pyopencl.array as cl_array 
from pyopencl.elementwise import ElementwiseKernel 

ctx = cl.create_some_context(0) 
queue = cl.CommandQueue(ctx) 

multiply = ElementwiseKernel(ctx, 
      "float *x, float *y, float *z", 
      "z[i] = x[i] * y[i]", 
      "multiplication") 

x = cl_array.arange(queue, 1000000, dtype=np.complex64) 
y = cl_array.arange(queue, 1000000, dtype=np.complex64) 
z = cl_array.empty_like(x) 

for n in range(10000): 
    z = x*y 
    multiply(x.real, y.real, z.real) 
    multiply(x, y, z) 

做兩個陣列的簡單乘法在for循環中的最後三個行做的當然就是同樣的事情乘法。然而,前兩個選項導致以下錯誤(我註釋掉當然其他兩個):

pyopencl.MemoryError: clEnqueueNDRangeKernel failed: mem object allocation failure 

我只是失去了爲什麼前兩個選項正在運行到分配錯誤。

NOTES:

GPU:[0] pyopencl.Device '佛得角' 上 'AMD加速並行處理' 在0x2a76d90

>>> pyopencl.VERSION 
(2013, 1) 

我知道複雜類型沒有被正確處理,但如果你把它們改成np.float32,我仍然會遇到同樣的問題。

回答

1

我簡化了你的程序,並以一種在我的電腦上工作的方式運行它。這裏是爲我工作的一個版本:

import numpy as np 
import pyopencl as cl 
import pyopencl.array as cl_array 
from pyopencl.elementwise import ElementwiseKernel 

ctx = cl.create_some_context(0) 
queue = cl.CommandQueue(ctx) 

multiply = ElementwiseKernel(ctx, 
      "float *x, float *y, float *z", 
      "z[i] = x[i] * y[i]", 
      "multiplication") 

x = cl_array.arange(queue, 1000000, dtype=np.float32) 
y = cl_array.arange(queue, 1000000, dtype=np.float32) 
z = cl_array.empty_like(x) 

for i in range(10000): 
    multiply(x, y, z) 

這個程序運行在使用np.float32緩衝內核。您的問題可能源於np.complex64類型,或者您稱爲.real 30000次 - 這可能會每次都會創建一個新的緩衝區。此外,您的緩衝區可能對GPU太大。嘗試將這些人的體積縮小。

我不確定你打算做什麼,但我強烈建議避免使用ElementWise,直到你花費了更多時間處理標準PyOpenCL。 ElementWise只是一些可能會混淆PyOpenCL的真實性質的語法糖。

在沒有ElementWise的情況下試圖解決您的問題將有助於您瞭解您的數據始終位於何處,如何管理您的隊列以及何時將內存複製到主機和從主機複製內存。