gpt4 book ai didi

python - PyOpenCL 索引问题

转载 作者:行者123 更新时间:2023-12-01 02:17:25 25 4
gpt4 key购买 nike

我正在 python 中尝试 OpenCl,但无法弄清楚这个简单的矩阵复制代码我做错了什么。

我的输入矩阵是:
[[1 2 3 4],
[5 6 7 8],
[9 10 11 12],
[13 14 15 16],
[17 18 19 20]]

我得到这个输出:
[[1 2 3 4],
[5 6 7 8],
[9 10 0 0],
[0 0 0 0],
[0 0 0 0]]

为什么只有我的矩阵的一部分被复制?我做错了什么?

这是我的代码:

import pyopencl as cl
import numpy as np

kernel = """
__kernel void
copy( __global const float *g_data, const int h, const int w, __global float *g_out )
{
// Get global position
size_t row = get_global_id(0);
const int s = row * w;
__global const float *in = &g_data[ s ];
__global float *out = &g_out[ s ];
for(int i=0; i<w; ++i)
{
out[i] = in[i];
}
}
"""

class test:
def __init__(self):
# Create opencl context
platform = cl.get_platforms()[2]
self.__ctx__ = cl.Context( [platform.get_devices()[0]] )
# Create opencl queue
self.__queue__ = cl.CommandQueue(self.__ctx__)
# Build opencl kernel
self.__kernel__ = cl.Program(self.__ctx__, kernel).build()


def __del__(self):
del self.__queue__
del self.__kernel__
del self.__ctx__

def __call__(self, data):
# Get matrix dimensions
h, w = data.shape
mf = cl.mem_flags
# Set input buffer
g_data = cl.Buffer(self.__ctx__, (mf.READ_ONLY | mf.COPY_HOST_PTR), hostbuf=data)
# Set output buffer
self.__out__ = np.zeros( data.shape, dtype=np.float )
g_out = cl.Buffer(self.__ctx__, mf.WRITE_ONLY, self.__out__.nbytes)
# Run kernel
kernel_event = self.__kernel__.copy(
self.__queue__,
(h,),
None,
g_data,
np.int32(h),
np.int32(w),
g_out,
wait_for=None
)
# Copy data
out_event = cl.enqueue_copy(self.__queue__, self.__out__, g_out, wait_for=[kernel_event])
out_event.wait()
# Free memory
g_out.release()
print( self.__out__ )

最佳答案

我知道我做错了什么:我的矩阵在 python(64 位机器)中声明为 64 位浮点,并且我在 OpenCL 代码中使用浮点指针似乎导致了问题。在 OpenCL 代码中将 float 更改为 double 可以解决该问题:)

关于python - PyOpenCL 索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48276227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com