gpt4 book ai didi

c - 如何将主机指针传递到映射设备内存而不复制主机数据?

转载 作者:行者123 更新时间:2023-11-30 14:23:52 25 4
gpt4 key购买 nike

我是 C、C++ 和 OpenCL 新手。我有两个问题。

(1) 如果我有许多主机输入数据变量,例如长数组和双数组,是否有任何方法可以避免将每个变量复制到设备(以传统的 OpenCL 方式,即 createBuffer 等),而只需映射一些内存从设备进入主机并将主机指针写入设备内存然后在内核中访问?有人告诉我有,但我无法找出执行此操作的代码。

下面我有一个示例输入数据数组。目标是以某种方式将指向它的指针中继到设备,而不以任何方式复制它,因为各种输入数据变量可能非常大。我分配一个缓冲区,将一个映射缓冲区排入队列,获取一个设备指针,但随后我不确定如何将输入传递给该设备指针。我使用了 cl_long 类型作为设备指针,这可能是错误的。

cl_long inputData[2] = {1,2};

cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
sizeof(cl_long) * 2, NULL, NULL);

cl long* inputMap = (cl_long*) clEnqueueMapBuffer(
queue, inputBuffer, TRUE, CL_MAP_WRITE, 0,
sizeof(cl_long) * 2, 0, NULL, NULL, NULL);

// what to do here?

clEnqueueUnmapMemObject(queue, inputBuffer, inputMap, 0, NULL, NULL);

我在上面使用了两个 cl_long 的空间,但实际上,如果我将指针传递给主机数据,我会在这里分配什么?

(2) 将指向多个输入变量的指针打包到 clEnqueueMapBuffer 返回的同一内存空间中怎么样?假设我有一个长数组和一个双数组,我可以将指向它们的指针传递到同一 block 映射设备内存中吗?

我真的很感激一些示例源代码,其中对主机和设备内存以及它们如何保持同步以及指针进行了特别阐述,因为我对它们有点陌生。

附注我看到了另一个将主机数据写入设备映射内存的示例(http://stackoverflow.com/questions/5673794/opencl-mapped-memory-doesnt-work),但它再次使用手动将数据写入内存相当于复制。

更新:为了回应 Raj 的评论(在此处回复,以防我的评论太长),我已经开始使用该标志,但我的指针代码中可能有错误。

double a[2] = { 3.0, 6.0 } ;
size_t pointerSize = sizeof(double*);

cl_mem bufA = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, pointerSize, NULL, NULL);
clSetKernelArg(kernel, 0, sizeof(cl_mem), &bufA);

double* pA = (double*) clEnqueueMapBuffer(queue, bufA, CL_TRUE, CL_MAP_WRITE, 0, pointerSize, 0, NULL, NULL, &err);
*pA = *a;

此时,如果我在内核本身中打印 a[0] 和 a[1],我会得到:

a[0]=3.000000
a[1]=-0.000000

a[1] 显然是错误的。你知道我做错了什么吗?

最佳答案

所以答案是使用clCreateBuffer创建一个缓冲区并传递此参数CL_MEM_ALLOC_HOST_PTR

查看此说明 OpenCL create Buffer API

在 CUDA 架构上,它类似于 cudaHostAlloccudaHostAlloc 将在主机上分配内存,GPU 设备也可以访问该内存。有关相同内容的更多信息可以在 Webpage 上找到。

关于c - 如何将主机指针传递到映射设备内存而不复制主机数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12456098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com