2

PyOpenCL を使用してイメージのコピーを作成する際に問題が発生しました。本当は他の処理をしたいのでコピーしてみたかったのですが、すべてのピクセルにアクセスするというこの基本的なタスクを理解できません。エラーをキャッチして、動作することを確認してください。

プログラムはこちら

import pyopencl as cl
import numpy
import Image
import sys

img = Image.open(sys.argv[1])
img_arr = numpy.asarray(img).astype(numpy.uint8)
dim = img_arr.shape

host_arr = img_arr.reshape(-1)

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
a_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=host_arr)
dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, host_arr.nbytes)

kernel_code = """
    __kernel void copyImage(__global const uint8 *a, __global uint8 *c)
    {
        int rowid = get_global_id(0);
        int colid = get_global_id(1);

        int ncols = %d;
        int npix = %d; //number of pixels, 3 for RGB 4 for RGBA

        int index = rowid * ncols * npix + colid * npix;
        c[index + 0] = a[index + 0];
        c[index + 1] = a[index + 1];
        c[index + 2] = a[index + 2];
    }
    """ % (dim[1], dim[2])

prg = cl.Program(ctx, kernel_code).build()

prg.copyImage(queue, (dim[0], dim[1]) , None, a_buf, dest_buf)

result = numpy.empty_like(host_arr)
cl.enqueue_copy(queue, result, dest_buf)

result_reshaped = result.reshape(dim)
img2 = Image.fromarray(result_reshaped, "RGB")
img2.save("new_image_gpu.bmp")

入力として与えた画像は ここに画像の説明を入力

ただし、プログラムからの出力は ここに画像の説明を入力

黒い線が表示される理由がわかりません。このバグの解決を手伝ってください。

ありがとうございました

わかった !だから私は解決策を見つけました。すべての uint8 を int に変更し、numpy 配列で「astype(numpy.uint8)」を削除しました。理由はわかりません。これを試してみたところ、うまくいきました。理由についての説明が役立ちます。また、これは今よりも多くのメモリを必要とするということですか? それは機能しますが、今ではもっと多くのメモリが必要だと思います。uint8 を使用した回避策が役立ちます。

4

1 に答える 1