[igt-dev] [PATCH i-g-t 12/12] i915/gem_mmap_offset: Crudely measure read/write to different mmaps

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri Sep 2 03:59:47 UTC 2022


On Thu, Sep 01, 2022 at 01:44:42PM +0200, Zbigniew Kempczyński wrote:
> From: Chris Wilson <chris.p.wilson at intel.com>
> 
> Compare the read/write performance of different mmap types to different
> memory regions.
>

+Petri - please decide can we merge this.

This tests performance only but execution time < 1s so I got no problem
with this (it may be handy in the future for debugging purposes).

Acked-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
 
--
Zbigniew
 
> Signed-off-by: Chris Wilson <chris.p.wilson at intel.com>
> ---
>  tests/i915/gem_mmap_offset.c | 74 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 74 insertions(+)
> 
> diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
> index 5c3ed3d29f..1f14265094 100644
> --- a/tests/i915/gem_mmap_offset.c
> +++ b/tests/i915/gem_mmap_offset.c
> @@ -107,6 +107,73 @@ static void make_resident(int i915, uint32_t batch, uint32_t handle)
>  		gem_close(i915, obj[1].handle);
>  }
>  
> +static void perf(int i915, const struct gem_memory_region *r)
> +{
> +#define MiB (1024 * 1024)
> +	const unsigned int rep = 1024;
> +	const uint64_t sz = 4096;
> +	struct timespec tv;
> +	uint32_t handle;
> +	char buf[4096];
> +
> +	/*
> +	 * Time reading/writing through each mmap type into each
> +	 * memory region to have a rough estimate of the memory
> +	 * bandwidth exposed to userspace across each link.
> +	 *
> +	 * For example, we would expect that reading and writing to
> +	 * lmem would utilise the full PCIe bandwidth (>3.2GiB/s),
> +	 * and notably be symmetric, the same in both directions.
> +	 */
> +
> +	handle = gem_create_in_memory_region_list(i915, 4096, 0, &r->ci, 1);
> +	make_resident(i915, 0, handle);
> +
> +	for_each_mmap_offset_type(i915, t) {
> +		double ns;
> +		void *ptr;
> +
> +		ptr = __mmap_offset(i915, handle, 0, sz,
> +				    PROT_READ | PROT_WRITE,
> +				    t->type);
> +		if (!ptr)
> +			continue;
> +
> +		igt_nsec_elapsed(memset(&tv, 0, sizeof(tv)));
> +		for (int i = 0; i < rep; i++)
> +			memset(ptr, 0, sz);
> +		ns = igt_nsec_elapsed(&tv);
> +		igt_info("%s: Clear    %12.2fMiB/s\n",
> +			 t->name, sz * rep * NSEC_PER_SEC / ns / MiB);
> +
> +		igt_nsec_elapsed(memset(&tv, 0, sizeof(tv)));
> +		for (int i = 0; i < rep; i++)
> +			memcpy(ptr, buf, sz);
> +		ns = igt_nsec_elapsed(&tv);
> +		igt_info("%s: Write    %12.2fMiB/s\n",
> +			 t->name, sz * rep * NSEC_PER_SEC / ns / MiB);
> +
> +		igt_nsec_elapsed(memset(&tv, 0, sizeof(tv)));
> +		for (int i = 0; i < rep; i++)
> +			memcpy(buf, ptr, sz);
> +		ns = igt_nsec_elapsed(&tv);
> +		igt_info("%s: Read     %12.2fMiB/s\n",
> +			 t->name, sz * rep * NSEC_PER_SEC / ns / MiB);
> +
> +		igt_nsec_elapsed(memset(&tv, 0, sizeof(tv)));
> +		for (int i = 0; i < rep; i++)
> +			igt_memcpy_from_wc(buf, ptr, sz);
> +		ns = igt_nsec_elapsed(&tv);
> +		igt_info("%s: movntqda %12.2fMiB/s\n",
> +			 t->name, sz * rep * NSEC_PER_SEC / ns / MiB);
> +
> +		munmap(ptr, sz);
> +	}
> +
> +	gem_close(i915, handle);
> +#undef MiB
> +}
> +
>  static void bad_object(int i915)
>  {
>  	uint32_t real_handle;
> @@ -837,6 +904,13 @@ igt_main
>  		}
>  	}
>  
> +	igt_subtest_with_dynamic("perf") {
> +		for_each_memory_region(r, i915) {
> +			igt_dynamic_f("%s", r->name)
> +				perf(i915, r);
> +		}
> +	}
> +
>  	igt_subtest_f("blt-coherency")
>  		blt_coherency(i915);
>  
> -- 
> 2.34.1
> 


More information about the igt-dev mailing list