[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