Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ AMD_锁定_内存-同步传输到纹理_C++_C_Opengl - Fatal编程技术网

C++ AMD_锁定_内存-同步传输到纹理

C++ AMD_锁定_内存-同步传输到纹理,c++,c,opengl,C++,C,Opengl,我刚刚读了以下关于AMD_pinned_内存的内容 但是,我有一个关于同步传输的问题 将数据从缓冲区复制到纹理时,会显示以下示例(第12页): 将数据从缓冲区复制到纹理中 何时以及如何等待MU打开围栏?在使用纹理或其他东西之前,我是否需要调用glClientWaitSync或glWaitSync?我知道关于将数据写入映射缓冲区的其他问题。我认为您完全误解了OpenGL中映射缓冲区的整个思想。固定内存也帮不了你,因为即使固定了内存,你也需要与OpenGL同步(阅读链接的演示文稿第11页的最后一句话

我刚刚读了以下关于AMD_pinned_内存的内容

但是,我有一个关于同步传输的问题

将数据从缓冲区复制到纹理时,会显示以下示例(第12页):

将数据从缓冲区复制到纹理中


何时以及如何等待
MU打开围栏
?在使用纹理或其他东西之前,我是否需要调用
glClientWaitSync
glWaitSync

我知道关于将数据写入映射缓冲区的其他问题。我认为您完全误解了OpenGL中映射缓冲区的整个思想。固定内存也帮不了你,因为即使固定了内存,你也需要与OpenGL同步(阅读链接的演示文稿第11页的最后一句话)。最后但并非最不重要的一点是,固定内存只能在CPU/GPU组合(如AMD Fusion)上运行。在常规系统上,PCI-E瓶颈就在这两者之间


关于你最初的问题。我认为您完全误解了glMapBuffer的功能。它将GPU内存的一部分映射到应用程序地址空间。这与常规系统内存不同。事实上,保留原始数据的副本是个好主意。事实上,从映射缓冲区读取数据的性能会非常差,除非OpenGL驱动程序为您创建一个数据副本以供读取。想想看:每次映射缓冲区时,都必须从GPU复制数据


解决问题的方法很简单:只需保留一份数据副本。这不是瓶颈。而且,
glBufferSubData
可能更适合您。

我知道您关于将数据写入映射缓冲区的另一个问题。我认为您完全误解了OpenGL中映射缓冲区的整个思想。固定内存也帮不了你,因为即使固定了内存,你也需要与OpenGL同步(阅读链接的演示文稿第11页的最后一句话)。最后但并非最不重要的一点是,固定内存只能在CPU/GPU组合(如AMD Fusion)上运行。在常规系统上,PCI-E瓶颈就在这两者之间


关于你最初的问题。我认为您完全误解了glMapBuffer的功能。它将GPU内存的一部分映射到应用程序地址空间。这与常规系统内存不同。事实上,保留原始数据的副本是个好主意。事实上,从映射缓冲区读取数据的性能会非常差,除非OpenGL驱动程序为您创建一个数据副本以供读取。想想看:每次映射缓冲区时,都必须从GPU复制数据


解决问题的方法很简单:只需保留一份数据副本。这不是瓶颈。也许
glBufferSubData
更适合您。

您需要与OpenGL同步(阅读第11页的最后一句话),我知道,这会有什么变化?在cpu同步时,我仍然可以读取数据?“最后但并非最不重要的一点是,固定内存只能在AMD Fusion等CPU/GPU组合上运行。“CUDA不建议在Nvidia卡上使用固定内存吗?”它将GPU内存的一部分映射到应用程序地址空间。这与常规系统内存不同。“它不需要将GPU内存的一部分映射到系统内存吗?”事实上,从映射缓冲区读取数据的性能会非常差"我知道这一点,SSE 4.1流式加载不解决这个问题吗,因为它允许从uswc内存进行高效读取?实际上,对于Nvidia卡,我必须使用固定内存和CUDA memcpy来解决Gerforce Fermi卡上可怕的
glReadPixels
性能问题。@ronag:SSE流式加载与t完全无关帽子。因为它在CPU内存上运行。然而,GPU内存必须通过称为PCI-E的瓶颈进行访问,该瓶颈比CPU内存总线慢几个数量级。CUDA的建议源于这样一个事实,即固定内存可以使DMA引擎更高效地工作。AMD Fusion具有一个很好的优势,即GPU和CPU共享内存相同的内存(总线),因此映射的GPU内存不会通过该瓶颈。在流的情况下,读取的数据来自GPU。glUnmapBuffer的幕后发生的事情是完全未定义的,并对实现开放。“您需要与OpenGL同步(阅读第11页的最后一句话)”,我知道,这会改变什么?我仍然可以在cpu上读取同步时的数据?“最后但并非最不重要的是,固定内存只能在cpu/GPU组合(如AMD Fusion)上运行。”CUDA不建议在Nvidia卡上使用固定内存吗?“它将GPU内存的一部分映射到应用程序地址空间。这与常规系统内存不同。“它不必将GPU内存的一部分映射到系统内存吗?”事实上,从映射的缓冲区读取数据会有相当糟糕的性能"我知道这一点,SSE 4.1流式加载不解决这个问题吗,因为它允许从uswc内存进行高效读取?实际上,对于Nvidia卡,我必须使用固定内存和CUDA memcpy来解决Gerforce Fermi卡上可怕的
glReadPixels
性能问题。@ronag:SSE流式加载与t完全无关帽子。因为它在CPU内存上运行。然而,GPU内存必须通过称为PCI-E的瓶颈进行访问,该瓶颈比CPU内存总线慢几个数量级。CUDA的建议源于这样一个事实,即固定内存可以使DMA引擎更高效地工作。AMD Fusion具有一个很好的优势,即GPU和CPU共享内存相同的内存(总线),因此映射的GPU内存不会通过该瓶颈。在流的情况下,读取的数据来自GPU。glUnmapBuffer的幕后发生的事情完全没有定义,并对实现开放。
// Bind buffer as unpack buffer to copy data into a texture object
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pBuffer[m_uiBufferIdx]);
// Copy pinned memory to texture
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_uiTexWidth, m_uiTexHeight, m_nExtFormat, m_nType, NULL);
// Insert Sync object to check for completion
m_UnPackFence= glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);