问题标签 [zero-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
4296 浏览

c++ - 我可以在 C++ 中从 const char * 数组进行零拷贝 std::string 分配吗?

对我的应用程序的分析表明,它在字符串分配上花费了近 5% 的 CPU 时间。在很多很多地方,我正在从 64MB 字符缓冲区制作 C++ std::string 对象。问题是,缓冲区在程序运行期间永远不会改变。我对std::string(const char *buf,size_t buflen)调用的分析是正在复制字符串,因为缓冲区可能会在字符串生成后发生变化。这不是这里的问题。有没有办法解决这个问题?

编辑:我正在处理二进制数据,所以我不能只是传递char *s. 此外,我会因为总是扫描 NULL 而产生大量开销,而这是std::string避免的。

0 投票
1 回答
1875 浏览

c++ - Cuda 零拷贝性能

有没有人有使用零拷贝(参考这里:默认固定内存与零拷贝内存)内存模型分析 CUDA 应用程序性能的经验?

我有一个使用零拷贝功能的内核,使用 NVVP 我看到以下内容:

以平均问题大小运行内核,我得到 0.7% 的指令重放开销,所以没什么大不了的。所有这 0.7% 都是全局内存重放开销。

当我真正增加问题大小时,我得到了 95.7% 的指令重播开销,所有这些都是由于全局内存重播开销造成的。

但是,正常问题大小内核运行和非常非常大问题大小内核运行的全局加载效率和全局存储效率是相同的。我不太确定如何利用这些指标组合。

我不确定的主要事情是 NVVP 中的哪些统计数据将帮助我了解零拷贝功能的情况。关于我应该查看哪种类型的统计数据的任何想法?

0 投票
1 回答
2852 浏览

c - 使用管道、tee() 和 splice() 将数据发送到多个套接字

我正在使用 tee() 复制一个“主”管道,以使用 splice() 写入多个套接字。自然,这些管道将以不同的速率清空,具体取决于我可以将多少 splice() 连接到目标套接字。因此,当我接下来将数据添加到“主”管道然后再次 tee() 时,我可能会遇到这样一种情况,即我可以将 64KB 写入管道,但只能将 4KB 写入“从属”管道之一。我猜如果我将所有“主”管道拼接()到套接字,我将永远无法将剩余的 60KB 发送到该从管道。真的吗?我想我可以跟踪一个 tee_offset (从 0 开始),我将它设置为“unteed”数据的开头,然后不要 splice() 越过它。所以在这种情况下,我会将 tee_offset 设置为 4096 并且不会拼接更多,直到我' 我能够将它全部连接到其他管道。我在正确的轨道上吗?对我有什么提示/警告吗?

0 投票
1 回答
2327 浏览

c# - 有没有办法在 .NET 中执行零复制?

在 Java 中,我会使用java.nio库并使用FileChannel.transferTo()and FileChannel.transferFrom()。在(特别是)C# 中是否有类似的东西,或者我是否必须从某个地方加载一些非托管的 .dll?谷歌在这种情况下没有用。

编辑:我应该注意我的目标是 .NET 3.5。

0 投票
1 回答
938 浏览

c++ - 为什么用于零拷贝的 OpenOnload 扩展 API 没有用于 UDP 发送或 TCP 接收的任何内容?

根据 OpenOnload Extensions API 文档,零拷贝 API 不包括 UDP 发送和 TCP 接收方案。为什么?

0 投票
1 回答
1187 浏览

linux - 如何应对 3.2 亿个 272 字节的 UDP 数据包?

因此,我有一个由 272 字节数据包组成的传入 UDP 流,数据速率约为 5.12Gb/s(大约每秒 320e6 个数据包)。该数据由基于 FPGA 的定制板发送。数据包大小是正在运行的数字设计的限制,因此尽管理论上可以增加它以提高效率,但这需要大量的工作。在接收端,这些数据包由网络线程读取和解释,并放置在与缓冲线程共享的循环缓冲区中,该缓冲区会将这些数据复制到 GPU 进行处理。

接收端的上述设置可以使用简单recv的调用处理 5.12Gb/s 的 4096 KB 数据包(用于不同的设计),但是对于当前的数据包大小,我也很难跟上数据包流许多时间被“浪费”在上下文切换和从内核空间复制小数据段到用户空间。我做了一个使用 的快速测试实现recvmmsg,但是事情并没有太大改善。平均而言,我可以处理大约 40% 的传入数据包。

所以我想知道是否可以为我的应用程序(mmap 样式)获取内核的 UDP 数据缓冲区的句柄,或者使用某种从内核到用户空间的零复制?或者,您是否知道任何其他方法可以减少这种开销并能够执行所需的处理?

这是在使用 C 代码的 Linux 机器(内核 3.2.0-40)上运行的。

0 投票
2 回答
702 浏览

django - 来自子进程的 django(或 wsgi)链标准输出

我正在 Django 中编写一个 Web 服务来处理图像/视频流,但它主要是在外部程序中完成的。例如:

  1. 客户要求/1.jpg?size=300x200
  2. 300x200在 django(或其他 WSGI 应用程序)中解析 python 代码
  3. python调用convert(Imagemagick的一部分)使用subprocess模块,参数为300x200
  4. convert从本地磁盘读取 1.jpg,并相应地转换为大小
  5. 写入临时文件
  6. Django 构建HttpResponse()并读取整个临时文件内容作为正文

如您所见,整个临时文件读写过程是低效的。我需要一种通用的方法来处理类似的外部程序,不仅如此convert,还有其他类似cjpeg的,ffmepg等等,甚至是专有的二进制文件。

我想以这种方式实现它:

  1. python获取子进程fd的stdoutconvert
  2. 将其链接到 WSGI 套接字 fd 以进行输出

我已经完成了我的功课,谷歌说这种零拷贝可以通过系统调用来完成splice()。但它在 Python 中不可用。那么如何在这种情况下最大化 Python 的性能呢?

  1. ctypes使用?调用 splice()
  2. 破解 memoryview() 或 buffer() ?
  3. subprocess has stdoutwhich has readinto(),可以以某种方式使用吗?
  4. 我们如何获得任何 WSGI 应用程序的 fd 编号?

我对这些有点新手,任何建议表示赞赏,谢谢!

0 投票
1 回答
465 浏览

qt - 如何在 Qt C++ 程序中进行零拷贝?

我必须在 Qt C++ 的程序中实现零复制方法,我阅读了它并得到了 transferto() 方法。如下所述: public void transferTo(long position, long count, WritableByteChannel target);

但我不明白它是如何工作的。它在内部写成,它取决于底层操作系统对零拷贝的支持。所以我尝试编写一个函数,但我没有在这里得到“位置”和“通道”的含义。

谁能帮我?

0 投票
3 回答
326 浏览

c++ - C++ 中 Qt 应用程序中的零拷贝

这是我为在 Qt 应用程序中实现零拷贝而编写的程序,但出现以下错误:

错误如下:

我知道transmitfile() api有错误,但是可以删除,上面的错误怎么办?`在这里输入代码?

0 投票
0 回答
152 浏览

c++ - Qt 客户端程序中的零拷贝

我正在尝试在我的客户端程序中实现零复制方法,我将从服务器接收大量数据。这是我的客户端程序://Client.h

//客户端.cpp

readanydata() 应该被任何其他 API 替换,因为 read() 和 readall() 使用内存复制,它们不适合零复制方法。客户端是 QTcpsocket 的实例。我应该在这里使用什么。任何建议,因为我不是获取任何 API 或者我应该编写自己的函数。如果我必须编写自己的函数,它将如何调用传输文件() api。