gpt4 book ai didi

c - 每次执行后更新 opencl 中的缓冲区

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

所以我已经编写了一段代码并且它可以工作,现在我想做的是多次调用 clEnqueueNDRangeKernel() ,并且在每次执行后我想用该输出更新缓冲区(缓冲区 Y)。我编写了以下代码,我想知道它对于该函数是否正确。我没有为它编写单独的 setkernelArg() 命令。

    for (int a = 0; a < 100; a++)
{
ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, globalws, NULL, 0, NULL, NULL);

if (ret != CL_SUCCESS) {
printf("Failed to enqueueNDRangeKernel.\n");
exit(1);
}

clEnqueueReadBuffer(command_queue, bufferC, CL_TRUE, 0, M*N * sizeof(float), (void *)C, 0, NULL, NULL);
clEnqueueWriteBuffer(command_queue, bufferY, CL_TRUE, 0, 1 * N * sizeof(float), (void *)C, 0, NULL, NULL);
for (int i = 0; i < N; i++) {
printf("%f, ", C[i]);
}
}

最佳答案

您应该等待每个 OpenCL Api 调用。为每个调用创建事件。因此,您可以确定每次执行都已完成,然后才开始下一次执行。例如,内核可能在 GPU 上执行一些计算,但同​​时启动 clEnqueueReadBuffer 并在内核完成写入输出缓冲区之前读取输出缓冲区。您也有可能在 clEnqueueReadBuffer 完成之前写入 GPU。OpenCL Api 调用开始在 GPU 上执行,但主机程序也会继续。

通过事件,您的程序可能如下所示:

cl_event evKernel, evReadBuf, evWriteBuf;

for(int a = 0; a < 100; a++)
{
ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, globalws, NULL, 0, NULL, &evKernel);

if (ret != CL_SUCCESS) {
printf("Failed to enqueueNDRangeKernel.\n");
exit(1);
}
clWaitForEvents(1, &evKernel);

clEnqueueReadBuffer(command_queue, bufferC, CL_TRUE, 0, M*N * sizeof(float), (void *)C, 0, NULL, &evReadBuf);
clWaitForEvents(1, &evReadBuf);
clEnqueueWriteBuffer(command_queue, bufferY, CL_TRUE, 0, 1 * N * sizeof(float), (void *)C, 0, NULL, &evWriteBuf);
clWaitForEvents(1, &evWriteBuf);

for (int i = 0; i < N; i++) {
printf("%f, ", C[i]);
}
}

随着事件的发生,循环的执行时间将会增加。

在 clEnqueueWriteBuffer 调用中,您从大于设备缓冲区 (1*N*sizeof(float) 的主机内存 ( M*N*sizeof(float) ) 写入)。(也许你的意思是(M*N*sizeof(float))?)主机端的程序会崩溃(无效的内存访问),但 OpenCL 不会提示它并复制数据。我不确定,但这可能会在将来引起问题。

我不知道你的内核做了什么,但如果内核只将数据写入主机端所需的输出缓冲区,那就更好了。你将bufferC复制到C,但只将C的一部分复制到bufferY,这似乎是下一个内核的输入。也许你可以在内核中进行更改。

将数据从主机复制到设备或设备到主机是一个昂贵的部分。因此,出于性能原因,您不应复制进一步计算不需要的数据。

关于c - 每次执行后更新 opencl 中的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51808365/

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