2013-11-02 44 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的情况下试图解决您的问题将有助于您了解您的数据始终位于何处,如何管理您的队列以及何时将内存复制到主机和从主机复制内存。