在for循环中使用简单乘法的pyopencl分配错误

在for循环中使用简单乘法的pyopencl分配错误,opencl,pyopencl,Opencl,Pyopencl,我正在使用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

我正在使用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)
最后三行当然做同样的事情,即乘法。但是,前两个选项会导致以下错误(我当然会注释掉另外两个):

我不明白为什么前两个选项会出现分配错误

注:

GPU:[0]pyopencl。设备“Capeverd”位于0x2a76d90的“AMD加速并行处理”上

>>> pyopencl.VERSION
(2013, 1)

我知道复杂类型没有得到正确的处理,但是如果你把它们改成np.float32,我仍然会遇到同样的问题

我简化了您的程序,并以在我的计算机上运行的方式运行了一次。以下是一个适合我的版本:

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来说可能太大。试着把它们的尺寸降低一点

我不确定您的具体目标是什么,但我强烈建议您在花多一点时间使用标准PyOpenCL之前避免使用ElementWise。ElementWise只是一些语法上的糖分,可能会混淆PyOpenCL所做工作的真正本质

尝试在不使用ElementWise的情况下解决问题将帮助您了解数据始终位于何处、如何管理队列以及何时将内存复制到主机或从主机复制内存

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)