Opencl 两个缓冲区的索引副本
我有下面的例程,该例程基于在index中找到的索引,将元素从src矩阵复制到dst矩阵。索引计算正确,但dst未更新。我错过了什么Opencl 两个缓冲区的索引副本,opencl,gpu,gpgpu,Opencl,Gpu,Gpgpu,我有下面的例程,该例程基于在index中找到的索引,将元素从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_id
__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]];
}
(k=0;k{
dst[k]=src[m*列+索引[k]];
}
它从矩阵src中的列复制所有索引元素
这就是我如何读回缓冲区(在评论中询问):
rc=clenqueueredbuffer(ompctx->clctx.queue,c,
CL_TRUE、0、i*sizeof(real)和tmp[0],
0,空,空);
如果(rc!=CL_成功){
日志错误(“omp”,“[%d]readbuf()失败”,rc);
后悔莫及;
}
日志信息(“omp”、“c”);
对于(k=0;k
主机代码中一定有错误。请核实:
- allOpenCLAPI调用的返回值
- 缓冲区创建标志(您需要对目标缓冲区进行写访问)
- 内核参数对应于内核代码
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]);
}