[PATCH 3/3] drm/amdgpu: add the amdgpu buffer object move speed metrics

Liang, Prike Prike.Liang at amd.com
Mon Apr 22 13:54:15 UTC 2024


[AMD Official Use Only - General]

Soft ping for the series.

Thanks,
Prike

> -----Original Message-----
> From: Liang, Prike <Prike.Liang at amd.com>
> Sent: Tuesday, April 16, 2024 4:52 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Liang, Prike
> <Prike.Liang at amd.com>
> Subject: [PATCH 3/3] drm/amdgpu: add the amdgpu buffer object move
> speed metrics
>
> Add the amdgpu buffer object move speed metrics.
>
> Signed-off-by: Prike Liang <Prike.Liang at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h           |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | 78
> ++++++++++++++-----
>  drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |  2 +-
>  3 files changed, 61 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 163d221b3bbd..2840f1536b51 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -502,7 +502,7 @@ void amdgpu_device_wb_free(struct amdgpu_device
> *adev, u32 wb);
>  /*
>   * Benchmarking
>   */
> -int amdgpu_benchmark(struct amdgpu_device *adev, int test_number);
> +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number,
> +struct seq_file *m);
>
>  int amdgpu_benchmark_dump(struct amdgpu_device *adev, struct seq_file
> *m);
>  /*
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> index f6848b574dea..fcd186ca088a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> @@ -65,20 +65,27 @@ static void amdgpu_benchmark_log_results(struct
> amdgpu_device *adev,
>                                        int n, unsigned size,
>                                        s64 time_ms,
>                                        unsigned sdomain, unsigned
> ddomain,
> -                                      char *kind)
> +                                      char *kind, struct seq_file *m)
>  {
>       s64 throughput = (n * (size >> 10));
>
>       throughput = div64_s64(throughput, time_ms);
>
> -     dev_info(adev->dev, "amdgpu: %s %u bo moves of %u kB from"
> -              " %d to %d in %lld ms, throughput: %lld Mb/s or %lld
> MB/s\n",
> -              kind, n, size >> 10, sdomain, ddomain, time_ms,
> -              throughput * 8, throughput);
> +     if (m) {
> +             seq_printf(m, "\tamdgpu: %s %u bo moves of %u kB from"
> +                      " %d to %d in %lld ms, throughput: %lld Mb/s or %lld
> MB/s\n",
> +                     kind, n, size >> 10, sdomain, ddomain, time_ms,
> +                     throughput * 8, throughput);
> +     } else {
> +             dev_info(adev->dev, "amdgpu: %s %u bo moves of %u kB
> from"
> +                      " %d to %d in %lld ms, throughput: %lld Mb/s or %lld
> MB/s\n",
> +                     kind, n, size >> 10, sdomain, ddomain, time_ms,
> +                     throughput * 8, throughput);
> +     }
>  }
>
>  static int amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned
> size,
> -                              unsigned sdomain, unsigned ddomain)
> +                              unsigned sdomain, unsigned ddomain, struct
> seq_file *m)
>  {
>       struct amdgpu_bo *dobj = NULL;
>       struct amdgpu_bo *sobj = NULL;
> @@ -109,7 +116,7 @@ static int amdgpu_benchmark_move(struct
> amdgpu_device *adev, unsigned size,
>                       goto out_cleanup;
>               else
>                       amdgpu_benchmark_log_results(adev, n, size,
> time_ms,
> -                                                  sdomain, ddomain,
> "dma");
> +                                                  sdomain, ddomain, "dma",
> m);
>       }
>
>  out_cleanup:
> @@ -124,7 +131,7 @@ static int amdgpu_benchmark_move(struct
> amdgpu_device *adev, unsigned size,
>       return r;
>  }
>
> -int amdgpu_benchmark(struct amdgpu_device *adev, int test_number)
> +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number,
> +struct seq_file *m)
>  {
>       int i, r;
>       static const int
> common_modes[AMDGPU_BENCHMARK_COMMON_MODES_N] = { @@ -
> 153,13 +160,16 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int
> test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (simple test, VRAM to GTT and
> GTT to VRAM)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m, "\tbenchmark test: %d (simple test,
> VRAM to GTT and GTT to VRAM)\n",
> +                      test_number);
>               /* simple test, VRAM to GTT and GTT to VRAM */
>               r = amdgpu_benchmark_move(adev, 1024*1024,
> AMDGPU_GEM_DOMAIN_GTT,
> -                                       AMDGPU_GEM_DOMAIN_VRAM);
> +                                       AMDGPU_GEM_DOMAIN_VRAM,
> m);
>               if (r)
>                       goto done;
>               r = amdgpu_benchmark_move(adev, 1024*1024,
> AMDGPU_GEM_DOMAIN_VRAM,
> -                                       AMDGPU_GEM_DOMAIN_GTT);
> +                                       AMDGPU_GEM_DOMAIN_GTT, m);
>               if (r)
>                       goto done;
>               break;
> @@ -167,9 +177,13 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (simple test, VRAM to
> VRAM)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m, "\tbenchmark test: %d (simple test,
> VRAM to VRAM)\n",
> +                      test_number);
> +
>               /* simple test, VRAM to VRAM */
>               r = amdgpu_benchmark_move(adev, 1024*1024,
> AMDGPU_GEM_DOMAIN_VRAM,
> -                                       AMDGPU_GEM_DOMAIN_VRAM);
> +                                       AMDGPU_GEM_DOMAIN_VRAM,
> m);
>               if (r)
>                       goto done;
>               break;
> @@ -177,11 +191,15 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (GTT to VRAM, buffer size
> sweep, powers of 2)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m, "\tbenchmark test: %d (GTT to VRAM,
> buffer size sweep, powers of 2)\n",
> +                             test_number);
> +
>               /* GTT to VRAM, buffer size sweep, powers of 2 */
>               for (i = 1; i <= 16384; i <<= 1) {
>                       r = amdgpu_benchmark_move(adev, i *
> AMDGPU_GPU_PAGE_SIZE,
>
> AMDGPU_GEM_DOMAIN_GTT,
> -
> AMDGPU_GEM_DOMAIN_VRAM);
> +
> AMDGPU_GEM_DOMAIN_VRAM, m);
>                       if (r)
>                               goto done;
>               }
> @@ -190,11 +208,14 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (VRAM to GTT, buffer size
> sweep, powers of 2)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m,"\tbenchmark test: %d (VRAM to GTT,
> buffer size sweep, powers of 2)\n",
> +                             test_number);
>               /* VRAM to GTT, buffer size sweep, powers of 2 */
>               for (i = 1; i <= 16384; i <<= 1) {
>                       r = amdgpu_benchmark_move(adev, i *
> AMDGPU_GPU_PAGE_SIZE,
>
> AMDGPU_GEM_DOMAIN_VRAM,
> -
> AMDGPU_GEM_DOMAIN_GTT);
> +
> AMDGPU_GEM_DOMAIN_GTT, m);
>                       if (r)
>                               goto done;
>               }
> @@ -203,11 +224,14 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (VRAM to VRAM, buffer size
> sweep, powers of 2)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m, "\tbenchmark test: %d (VRAM to VRAM,
> buffer size sweep, powers of 2)\n",
> +                              test_number);
>               /* VRAM to VRAM, buffer size sweep, powers of 2 */
>               for (i = 1; i <= 16384; i <<= 1) {
>                       r = amdgpu_benchmark_move(adev, i *
> AMDGPU_GPU_PAGE_SIZE,
>
> AMDGPU_GEM_DOMAIN_VRAM,
> -
> AMDGPU_GEM_DOMAIN_VRAM);
> +
> AMDGPU_GEM_DOMAIN_VRAM, m);
>                       if (r)
>                               goto done;
>               }
> @@ -216,11 +240,14 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (GTT to VRAM, buffer size
> sweep, common modes)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m,"\tbenchmark test: %d (GTT to VRAM,
> buffer size sweep, common modes)\n",
> +                             test_number);
>               /* GTT to VRAM, buffer size sweep, common modes */
>               for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N;
> i++) {
>                       r = amdgpu_benchmark_move(adev,
> common_modes[i],
>
> AMDGPU_GEM_DOMAIN_GTT,
> -
> AMDGPU_GEM_DOMAIN_VRAM);
> +
> AMDGPU_GEM_DOMAIN_VRAM, m);
>                       if (r)
>                               goto done;
>               }
> @@ -229,11 +256,14 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>               dev_info(adev->dev,
>                        "benchmark test: %d (VRAM to GTT, buffer size
> sweep, common modes)\n",
>                        test_number);
> +             if (m)
> +                     seq_printf(m,"\tbenchmark test: %d (VRAM to GTT,
> buffer size sweep, common modes)\n",
> +                             test_number);
>               /* VRAM to GTT, buffer size sweep, common modes */
>               for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N;
> i++) {
>                       r = amdgpu_benchmark_move(adev,
> common_modes[i],
>
> AMDGPU_GEM_DOMAIN_VRAM,
> -
> AMDGPU_GEM_DOMAIN_GTT);
> +
> AMDGPU_GEM_DOMAIN_GTT, m);
>                       if (r)
>                               goto done;
>               }
> @@ -241,12 +271,15 @@ int amdgpu_benchmark(struct amdgpu_device
> *adev, int test_number)
>       case 8:
>               dev_info(adev->dev,
>                        "benchmark test: %d (VRAM to VRAM, buffer size
> sweep, common modes)\n",
> -                      test_number);
> +                     test_number);
> +             if (m)
> +                     seq_printf(m,"\tbenchmark test: %d (VRAM to VRAM,
> buffer size sweep, common modes)\n",
> +                             test_number);
>               /* VRAM to VRAM, buffer size sweep, common modes */
>               for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N;
> i++) {
>                       r = amdgpu_benchmark_move(adev,
> common_modes[i],
>                                             AMDGPU_GEM_DOMAIN_VRAM,
> -                                           AMDGPU_GEM_DOMAIN_VRAM);
> +                                           AMDGPU_GEM_DOMAIN_VRAM,
> m);
>                       if (r)
>                               goto done;
>               }
> @@ -449,7 +482,7 @@ static void
> amdgpu_benchmark_mem_metrics_dump(struct amdgpu_device *adev,
> struct
>                       &adev->mman.gtt_mgr.manager;
>       struct ttm_resource_manager *vram_man =
>                       &adev->mman.vram_mgr.manager;
> -     uint32_t l1_cache_size;
> +     uint32_t l1_cache_size, j;
>
>       seq_puts(m, "amdgpu benchmark mem metrics dump:\n");
>
> @@ -483,6 +516,13 @@ static void
> amdgpu_benchmark_mem_metrics_dump(struct amdgpu_device *adev,
> struct
>                       atomic64_read(&adev->gart_pin_size));
>       seq_printf(m, "\tGTT heap usage size:%lld KB\n",
> ttm_resource_manager_usage(gtt_man));
>
> +     seq_printf(m, "\t--------amdgpu buffer object move speed test begin---
> -----\n");
> +     for (j = 1; j < 8; j++) {
> +             /*TODO: Add the cases of gfx and CPU move cases.*/
> +             amdgpu_benchmark(adev, j, m);
> +     }
> +     seq_printf(m, "\t--------amdgpu buffer object move speed test
> +end--------\n");
> +
>       seq_printf(m, "\n");
>
>  }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> index 7e935b9736c1..4d710c5f8465 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -1760,7 +1760,7 @@ static int amdgpu_debugfs_benchmark(void *data,
> u64 val)
>               return r;
>       }
>
> -     r = amdgpu_benchmark(adev, val);
> +     r = amdgpu_benchmark(adev, val, NULL);
>
>       pm_runtime_mark_last_busy(dev->dev);
>       pm_runtime_put_autosuspend(dev->dev);
> --
> 2.34.1



More information about the amd-gfx mailing list