[Mesa-dev] [PATCH] mesa: Add missing _mm_mfence() before streaming loads.

Jordan Justen jordan.l.justen at intel.com
Thu Oct 1 11:20:18 PDT 2015


On 2015-10-01 10:11:33, Matt Turner wrote:
> According to the Intel Software Development Manual:

How about a more specific doc location?

According to the Intel Software Development Manual (Volume 1: Basic
Architecture, 12.10.3 Streaming Load Hint Instruction):

>    Streaming loads may be weakly ordered and may appear to software to
>    execute out of order with respect to other memory operations.
>    Software must explicitly use fences (e.g. MFENCE) if it needs to
>    preserve order among streaming loads or between streaming loads and
>    other memory operations.

Does this mean we need a mfence following the load as well?

-Jordan

> That is, a memory fence is needed to preserve the order between the GPU
> writing the buffer and the streaming loads reading it back.
> 
> Reported-by: Joseph Nuzman <joseph.nuzman at intel.com>
> ---
>  src/mesa/main/streaming-load-memcpy.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/src/mesa/main/streaming-load-memcpy.c b/src/mesa/main/streaming-load-memcpy.c
> index d7147af..32854b6 100644
> --- a/src/mesa/main/streaming-load-memcpy.c
> +++ b/src/mesa/main/streaming-load-memcpy.c
> @@ -54,16 +54,19 @@ _mesa_streaming_load_memcpy(void *restrict dst, void *restrict src, size_t len)
>  
>        memcpy(d, s, MIN2(bytes_before_alignment_boundary, len));
>  
>        d = (char *)ALIGN((uintptr_t)d, 16);
>        s = (char *)ALIGN((uintptr_t)s, 16);
>        len -= MIN2(bytes_before_alignment_boundary, len);
>     }
>  
> +   if (len >= 64)
> +      _mm_mfence();
> +
>     while (len >= 64) {
>        __m128i *dst_cacheline = (__m128i *)d;
>        __m128i *src_cacheline = (__m128i *)s;
>  
>        __m128i temp1 = _mm_stream_load_si128(src_cacheline + 0);
>        __m128i temp2 = _mm_stream_load_si128(src_cacheline + 1);
>        __m128i temp3 = _mm_stream_load_si128(src_cacheline + 2);
>        __m128i temp4 = _mm_stream_load_si128(src_cacheline + 3);
> -- 
> 2.4.9
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list