使用clCreateBuffer + CL_MEM_COPY_HOST_PTR创建缓冲区对象与clCreateBuffer + clEnqueueWriteBuffer有什么区别? [英] What is the difference between creating a buffer object with clCreateBuffer + CL_MEM_COPY_HOST_PTR vs. clCreateBuffer + clEnqueueWriteBuffer?

查看:145
本文介绍了使用clCreateBuffer + CL_MEM_COPY_HOST_PTR创建缓冲区对象与clCreateBuffer + clEnqueueWriteBuffer有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在教程中看到了这两个版本,但是我找不到它们的优缺点.哪一个是合适的?

I have seen both versions in tutorials, but I could not find out, what their advantages and disadvantages are. Which one is the proper one?

cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float) * DATA_SIZE, NULL, NULL);
clEnqueueWriteBuffer(command_queue, input, CL_TRUE, 0, sizeof(float) * DATA_SIZE, inputdata, 0, NULL, NULL);

vs.

cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, ,sizeof(float) * DATA_SIZE, inputdata, NULL);

谢谢.

[更新]

我在第二个示例中添加了CL_MEM_COPY_HOST_PTR,以使其正确.

I added CL_MEM_COPY_HOST_PTR, to the second example to make it correct.

推荐答案

我认为inputdata不为NULL.

I assume that inputdata is not NULL.

在那种情况下,第二种方法根本不起作用,因为规范指出,如果满足以下条件,则clCreateBuffer返回NULL和错误:

In that case the second approach should not work at all, since the specifications says, that clCreateBuffer returns NULL and an error, if:

如果host_ptr为NULL并且CL_MEM_USE_HOST_PTR或CL_MEM_COPY_HOST_PTR在标志中设置,或者host_ptr不为NULL但CL_MEM_COPY_HOST_PTR或CL_MEM_USE_HOST_PTR在标志中未设置,则为CL_INVALID_HOST_PTR.

CL_INVALID_HOST_PTR if host_ptr is NULL and CL_MEM_USE_HOST_PTR or CL_MEM_COPY_HOST_PTR are set in flags or if host_ptr is not NULL but CL_MEM_COPY_HOST_PTR or CL_MEM_USE_HOST_PTR are not set in flags.

所以您的意思是

clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,sizeof(float) * DATA_SIZE, inputdata, NULL);

clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,sizeof(float) * DATA_SIZE, inputdata, NULL);

第一个方法应该与您显示的第一种方法大致相同,而第二个方法实际上不会复制数据,而是使用提供的内存位置进行缓冲区存储(在其中缓存部分或全部)设备内存).这两个中哪个更好,显然取决于使用情况.

The first one should be more or less the same as the first approach you showed, while the second one won't actually copy the data, but instead use the supplied memory location for buffer storage (caching portions or all of it in device memory). Which of those two is better depends on the usage scenario obviously.

我个人更喜欢使用两步方法,首先分配缓冲区,然后再用writeToBuffer填充它,因为我发现更容易看到发生了什么(当然一个步骤可能会更快(或者可能不会更快,这仅仅是一个步骤).猜))

Personaly I prefer using the two step approach of first allocating the buffer and afterwards filling it with a writeToBuffer, since I find it easier to see what happens (of course one step might be faster (or it might not, thats just a guess))

这篇关于使用clCreateBuffer + CL_MEM_COPY_HOST_PTR创建缓冲区对象与clCreateBuffer + clEnqueueWriteBuffer有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆