0
私は形状の配列(28 * 28)をゼロで埋めようとしています。この配列は、PILライブラリを使用してイメージを配列に変換した結果です。私はOpenCLを使ってカーネルを書いた。プログラムは、ランダムなnumpy配列に対してうまく動作しますが、イメージから変換された配列ではうまく動作しません。しかし、画像は、適切に変換され、すなわち、所望の画素値を出力する。 問題がカーネル内のデータ型のどこにあるか(私はfloatをdoubleに変更しなければならなかった)の前に同様の状況に遭遇しました。opencl - パディングが異なる出力を生成する
import numpy
from PIL import Image
from numpy import array
import pyopencl as cl
def pad(x, order):
kernelsource = """
__kernel void pad(
__global double* A,
__global double* B,
const unsigned int M)
{
int i = get_global_id(0);
int j = get_global_id(1);
if((i<M) && (j<M))
{
if((j == 0) || (j == M-1) || (i == 0) || (i == M-1))
{
B[i*M + j] = 0;
}else{
B[i*M + j] = A[(i-1)*(M-2) + j-1];
}
}
}
"""
context = cl.create_some_context()
queue = cl.CommandQueue(context)
program = cl.Program(context, kernelsource).build()
out_order = order + 2
h_a = x
d_a = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=h_a)
h_b = numpy.empty((out_order,out_order))
d_b = cl.Buffer(context, cl.mem_flags.WRITE_ONLY, h_b.nbytes)
pad = program.pad
pad.set_scalar_arg_dtypes([None, None, numpy.uint32])
pad(queue, h_b.shape, None, d_a, d_b, out_order)
queue.finish()
cl.enqueue_copy(queue, h_b, d_b)
return h_b
私は、コードのこの部分を実行する場合:この実行中に、
[[ 0. 0. 0. 0. 0. ]
[ 0. 0.75495661 0.58017939 0.61390089 0. ]
[ 0. 0.33017635 0.98233609 0.77542593 0. ]
[ 0. 0.94607981 0.6020772 0.14673336 0. ]
[ 0. 0. 0. 0. 0. ]]
:しかし、私は正しい結果を得る
arr = numpy.random.rand(3,3)
print pad(arr,3)
を
image = Image.open('1.jpg')
data = array(image)
print pad(data,data.shape[0])
を私が手this:
[[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000]
[ 0.00000000e+000 -4.73788662e+226 -5.14319684e+303 -1.27732501e+294
-1.27733779e+294 -1.27701620e+294 -8.36396791e+298 nan
-1.96381395e+289 -1.68533731e+308 nan 3.62029008e-217
nan -1.79768197e+308 nan 5.97554844e-311
-7.58630869e+298 2.78134240e-309 2.17953307e-289 nan
7.74667808e-304 nan 3.19854370e-308 nan
5.77663315e-275 7.29111854e-304 8.34430283e-309 1.09916879e-311
-7.22416349e+221 0.00000000e+000]
...
...
[ 0.00000000e+000 5.43230923e-311 7.38794055e-310 5.43230922e-312
6.51877107e-311 8.47440239e-310 5.43230922e-312 1.08646185e-310
9.56086424e-310 5.43230922e-312 1.19510803e-310 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
6.36598737e-314 1.58101007e-322 0.00000000e+000 3.16202013e-322
2.47032823e-322 0.00000000e+000 4.94065646e-324 0.00000000e+000
6.36598738e-314 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000]]
何が問題になりましたか?データ型に問題がありますか?