3

を使用して 2D 配列を埋めようとしていpyOpenCLます。計算カーネルとその呼び出しは以下に掲載されています。

ctx = cl.Context([cl.get_platforms()[0].get_devices()[0]])
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
x_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=x)
y_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=y)
a_buf = cl.Buffer(ctx, mf.WRITE_ONLY, a.nbytes)

prg = cl.Program(ctx, """
//#define PYOPENCL_DEFINE_CDOUBLE
#include "pyopencl-complex.h"    
__kernel void makeA(const unsigned int ySize, const float cov,
                  const int x0, const int y0, __global const float *x, __global const float *y,
                  __global cfloat_t *a)
{
  int gid0 = get_global_id(0);
  int gid1 = get_global_id(1);

  a[gid1 + ySize*gid0] = (cfloat_t)(1, 0);
}
""").build()

prg.makeA(queue, a.shape, None, np.int32(ySize),
    np.float32(c), np.int32(x0), np.int32(y0), x_buf, y_buf, a_dest_buf)  
cl.enqueue_copy(queue, a, a_dest_buf)

これで問題なく動作するようです。今日、私は を使用すると非常に便利であることを学びましたworkgroups。これでは、うまく動作しません。関数呼び出しを次のように置き換えようとしました

prg.makeA(queue, a.shape, (16,16), np.int32(ySize),
    np.float32(c), np.int32(x0), np.int32(y0), x_buf, y_buf, a_dest_buf)

しかし、配列の新しい x および y インデックスを適切に計算する方法がわからないため、変更できません

a[yIdx + ySize*xIdx] = (cfloat)( x[xIdx] , 0);  
4

1 に答える 1

1

私は今、次のことを試しましたが、うまくいきました:

__kernel void makea(const unsigned int ySize, const float cov,
                  const int x0, const int y0, __global const float *x, __global const float *y,
                  __global cfloat_t *a)
{

  int xIdx = get_local_id(0)+get_group_id(0)*get_local_size(0);
  int yIdx = get_local_id(1)+get_group_id(1)*get_local_size(1);

  a[yIdx + ySize*xIdx] = (cfloat_t)(1, 0);
}
""").build()




prg.makeA(queue, a.shape, (32,32), np.int32(ySize),
    np.float32(c), np.int32(x0), np.int32(y0), x_buf, y_buf, a_dest_buf)

(32,32)これにより、サイズ 32x32 [関数呼び出しパラメーター: ]のワークグループを導入しました。これは現在、複数のマルチ ストリーム プロセッサを使用しているようです。

于 2014-04-12T15:40:51.687 に答える