【问题标题】:SIMD intrinsics: _mm_stream_load_si128 vs _mm_load_si128SIMD 内在函数:_mm_stream_load_si128 与 _mm_load_si128
【发布时间】:2015-11-11 01:58:02
【问题描述】:

什么时候应该使用流媒体版本,什么时候使用 SSE2 与 _mm_load_si128?什么是性能权衡?

【问题讨论】:

    标签: c++ intrinsics


    【解决方案1】:

    流式加载内在函数 (mm_stream_load_si128) “使用非临时内存提示”执行加载(根据 Intel Intrinsics Guide)。这意味着加载的值不会导致从缓存中清除任何内容。

    如果您将要立即操作的大量数据组合在一起,并且“长时间”不再查看,这将非常有用。这通常发生在流操作期间。当我知道我正在对一个大型数据集执行一个简单的操作时,我就使用了它,我知道数据无论如何都会很快从缓存中被逐出。 memcpy 等操作也属于这一类。

    非流式加载 (mm_load_si128) 将检索该值,并将受制于正常缓存规则。如果需要,它可能会逐出旧的缓存条目,并且能够从缓存中检索直到它被逐出。

    如果您希望在正常缓存逐出发生之前再次使用数据,则首选非流式加载。如果您在大型数据集上操作,其中给定的数据在被踢出缓存之前预计不会再次被访问,则首选流式加载。

    【讨论】:

    • 我不明白,为什么这对访问连续块或 RAM 的其他代码的 memcpy 有好处?缓存行是 64 字节 = 4x __m128i,也就是说,缓存它会大大加快接下来的 3 次加载?
    • 基于关于这个问题的旧主题的最后评论:software.intel.com/en-us/forums/intel-isa-extensions/topic/… 假设 CPU 优化了这样的读取,所有数据都加载到缓存行大小的缓冲区中,该缓冲区与数据缓存分开.在后续指令中读取缓冲区的内容时,这些缓冲区中的可用缓冲区并不多,因此最好,否则它可能会丢失并需要重新获取,这可能会带来很大的性能损失。并且复制本身不会比缓存内存快 - 但不会从缓存中驱逐整个工作集。
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多