如何解决传递给opencl内核的数组不正确
我正在努力尝试AMD Radeon RX570系列的opencl。
我试图将参数数组传递给opencl内核,但未成功。
这是代码
is_prime.py
import os
import sys
import numpy as np
import math
import pyopencl as cl
from pyopencl import mem_flags as mf
from pyopencl import map_flags as mapf
global prime_number
prime_number = np.array([2]).astype(np.uint64)
is_prime_prg_code = open("kernel/is_prime.cl").read()
global _is_prime_prg
_is_prime_prg = None
global cl_ctx
cl_ctx = cl.create_some_context()
global cl_queue
cl_queue = cl.CommandQueue(cl_ctx)
def _is_prime(number):
global _is_prime_prg
global cl_ctx
global cl_queue
if _is_prime_prg is None:
_is_prime_prg = cl.Program(cl_ctx,is_prime_prg_code).build()
res = np.array([0]).astype(np.uint64)
res_buffer = cl.Buffer(cl_ctx,mf.READ_WRITE | mf.COPY_HOST_PTR,hostbuf=res)
prime_buffer = cl.Buffer(cl_ctx,mf.READ_ONLY | mf.USE_HOST_PTR,hostbuf=prime_number)
arg = np.array([number,len(prime_number)]).astype(np.uint64)
print(arg)
arg_buffer = cl.Buffer(cl_ctx,hostbuf=arg)
_is_prime_prg.is_prime(cl_queue,(1,),None,arg_buffer,prime_buffer,res_buffer)
cl_queue.finish()
arr,event = cl.enqueue_map_buffer(cl_queue,res_buffer,mapf.READ,res.shape,dtype=np.uint64)
return arr[0];
_is_prime(3)
is_prime.cl
__kernel void is_prime(
__global const long * arg,__global long * prime_array,__global int * res
)
{
ulong * number = (ulong *)arg[0];
ulong * prime_array_len = (ulong *)arg[1];
int ret = 1;
int iter = 0;
printf("number = %d prime_array_len %d\n",*arg,*prime_array_len);
for (iter = 0; iter < *prime_array_len; iter++)
{
long prime = prime_array[iter];
if(prime * prime > *number){
break;
}
if(*number % prime == 0){
ret = 0;
break;
}
}
*res = ret;
}
这是输出结果
[3 1]
number = 3 prime_array_len 0
我在做什么错了?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。