gpt4 book ai didi

c - 第一次 clEnqueueMapBuffer 调用需要很多时间

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:49 26 4
gpt4 key购买 nike

我在为 OpenCL 代码采用 YOLO 时遇到性能问题。

该方法仅从设备中提取数据,第一次运行速度较慢,但​​接下来的几次调用速度很快。有调用日志,时间以微秒为单位:

clEnqueueMapBuffer      144469
memcpy 2
clEnqueueUnmapMemObject 31
clEnqueueMapBuffer 466
memcpy 103
clEnqueueUnmapMemObject 14
clEnqueueMapBuffer 468
memcpy 106
clEnqueueUnmapMemObject 17

第一次调用是使用 1 字节副本(其中 memcpy 需要 2 微秒)。

内存由代码分配:

if (!x)
x = (float*) calloc(n, sizeof(float));

buf.ptr = x;

cl_int clErr;
buf.org = clCreateBuffer(opencl_context, CL_MEM_READ_WRITE |
CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR, buf.len * buf.obs, buf.ptr, &clErr);

接下来是拉取数据的代码:

#ifdef BENCHMARK
clock_t t;
double time_taken;
t = clock();
#endif
cl_int clErr;
void* map = clEnqueueMapBuffer(opencl_queues[opencl_device_id_t], x_gpu.mem, CL_TRUE, CL_MAP_READ,
0, x_gpu.len * x_gpu.obs, 0, NULL, NULL, &clErr);
#ifdef BENCHMARK
t = clock() - t;
time_taken = ((double)t);
printf("clEnqueueMapBuffer\t%d\n", (int)time_taken);
t = clock();
#endif
if (clErr != CL_SUCCESS)
printf("could not map array to device. error: %s\n", clCheckError(clErr));
memcpy(x, map, (n - x_gpu.off) * x_gpu.obs);
#ifdef BENCHMARK
t = clock() - t;
time_taken = ((double)t);
printf("memcpy\t%d\n", (int)time_taken);
t = clock();
#endif
clErr = clEnqueueUnmapMemObject(opencl_queues[opencl_device_id_t], x_gpu.mem, map, 0, NULL, NULL);
if (clErr != CL_SUCCESS)
printf("could not unmap array from device. error: %s\n", clCheckError(clErr));
#ifdef BENCHMARK
t = clock() - t;
time_taken = ((double)t);
printf("clEnqueueUnmapMemObject\t%d\n", (int)time_taken);
#endif

第一次通话时延迟的原因可能是什么?如何减少延迟?

最佳答案

您的 clEnqueueMapBuffer() 调用是阻塞的(CL_TRUE 用于 blocking_map 参数)这意味着调用只会返回一次映射操作已完成。如果您的命令队列不是并发的,则任何先前排队的异步命令(例如排队的内核)都需要在映射甚至可以开始之前完成。如果有这样的早期命令,您实际上是在测量它们的完成情况以及内存映射操作。为避免这种情况,请在开始时钟之前添加一个 clFinish() 调用。 (调用 clFinish() 可能更有效,所以我建议您只保留它用于测量目的。)

关于c - 第一次 clEnqueueMapBuffer 调用需要很多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53267812/

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