Memset 在大数据上太慢。还有其他选择吗?
Memset too slow on large data. Any alternatives?
我有一个大 cv::Mat
,尺寸 (100,32768)
。我为视频流中的每一帧更新它。在更新之前,我需要将所有内容设置回零,所以我执行
memset(myMat.data,0,100*32768*sizeof(int))
平均需要 5 毫秒。
令人惊讶的是(至少对我而言)在调试模式下我得到了相同的时间,如果不是更快的话。虽然我很想解释为什么会发生这种情况(google 给了我很多理由,所以我最终会弄清楚),但我真正需要的是一种替代的更快的解决方案。有什么我可以做的吗?
DDR 4 3k ish 上限略低于 100 GB/s DDR 3 800 为 6.4 GB/s。
您的速度约为 12 MB/5ms,或 2.4 GB/s。
因此,根据您的 RAM,您可能接近硬件的最大速度。 2 倍还不错。
您正在处理适度稀疏的数组。根据数据的排列方式,非连续缓冲区可能是更好的计划。此外,GPU 的内部内存带宽往往比 CPU 更快,将您的工作转移到那里可能会有所帮助。
问题也可能是延迟;也许在使用另一个线程时清除另一个线程中的一个缓冲区会有所帮助。
大量减少内存使用并使其更本地化,可能会产生比您预期更大的影响。您的非归零代码似乎已受 RAM 速度限制。
我有一个大 cv::Mat
,尺寸 (100,32768)
。我为视频流中的每一帧更新它。在更新之前,我需要将所有内容设置回零,所以我执行
memset(myMat.data,0,100*32768*sizeof(int))
平均需要 5 毫秒。
令人惊讶的是(至少对我而言)在调试模式下我得到了相同的时间,如果不是更快的话。虽然我很想解释为什么会发生这种情况(google 给了我很多理由,所以我最终会弄清楚),但我真正需要的是一种替代的更快的解决方案。有什么我可以做的吗?
DDR 4 3k ish 上限略低于 100 GB/s DDR 3 800 为 6.4 GB/s。
您的速度约为 12 MB/5ms,或 2.4 GB/s。
因此,根据您的 RAM,您可能接近硬件的最大速度。 2 倍还不错。
您正在处理适度稀疏的数组。根据数据的排列方式,非连续缓冲区可能是更好的计划。此外,GPU 的内部内存带宽往往比 CPU 更快,将您的工作转移到那里可能会有所帮助。
问题也可能是延迟;也许在使用另一个线程时清除另一个线程中的一个缓冲区会有所帮助。
大量减少内存使用并使其更本地化,可能会产生比您预期更大的影响。您的非归零代码似乎已受 RAM 速度限制。