0

我有以下例程,它应该根据在 index.html 中找到的索引将元素从 src 矩阵复制到 dst 矩阵。索引计算正确,但 dst 未更新。我错过了什么?

__kernel void
src_indexed_copy(__global real *dst, __global const real *src,
   __global const int *index, int src_offset)
{
        int id = get_global_id(ROW_DIM);
        int src_idx = src_offset + index[id];
        dst[id] = src[src_idx];
}

全局工作区具有与索引数组中的索引一样多的工作项。

线性代码看起来像这样:

for (k = 0; k < n; k++) {
        dst[k] = src[m * column + index[k]];
}

它从矩阵 src 的列中复制所有索引元素。

这就是我读取缓冲区的方式(在评论中询问):

rc = clEnqueueReadBuffer(ompctx->clctx.queue, c,
        CL_TRUE, 0, i * sizeof(real), &tmp[0],
        0, NULL, NULL);
if (rc != CL_SUCCESS) {
    log_error("omp", "[%d] readbuf() failed", rc);
    goto err;
}
log_info("omp", "c");
for (k = 0; k < i; k++) {
    log_info("omp", "%6.8f", tmp[k]);
}
4

1 回答 1

1

主机代码一定有问题。请验证:

  • 所有OpenCL API 调用的返回值,
  • 缓冲区创建标志(您需要对目标缓冲区进行 WRITE 访问),
  • 内核参数对应于内核代码。
于 2013-04-10T15:57:33.047 回答