[Mesa-dev] [PATCH 1/2] gallium: add PIPE_COMPUTE_CAP_SUBGROUP_SIZE
Grigori Goronzy
greg at chown.ath.cx
Thu Jun 4 12:33:52 PDT 2015
On 28.05.2015 13:04, Grigori Goronzy wrote:
> We need this to implement OpenCL's
> CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE.
> ---
Ping?
> src/gallium/docs/source/screen.rst | 2 ++
> src/gallium/drivers/ilo/ilo_screen.c | 8 ++++++++
> src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 4 ++++
> src/gallium/drivers/radeon/r600_pipe_common.c | 6 ++++++
> src/gallium/drivers/radeon/r600_pipe_common.h | 20 ++++++++++++++++++++
> src/gallium/include/pipe/p_defines.h | 3 ++-
> 6 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
> index 416ef2d..32c1e87 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -382,6 +382,8 @@ pipe_screen::get_compute_param.
> Value type: ``uint32_t``
> * ``PIPE_COMPUTE_CAP_IMAGES_SUPPORTED``: Whether images are supported
> non-zero means yes, zero means no. Value type: ``uint32_t``
> +* ``PIPE_COMPUTE_CAP_SUBGROUP_SIZE``: The size of a basic execution unit in
> + threads. Also known as wavefront size, warp size or SIMD width.
>
> .. _pipe_bind:
>
> diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
> index b0fed73..f2a18b2 100644
> --- a/src/gallium/drivers/ilo/ilo_screen.c
> +++ b/src/gallium/drivers/ilo/ilo_screen.c
> @@ -195,6 +195,7 @@ ilo_get_compute_param(struct pipe_screen *screen,
> uint32_t max_clock_frequency;
> uint32_t max_compute_units;
> uint32_t images_supported;
> + uint32_t subgroup_size;
> } val;
> const void *ptr;
> int size;
> @@ -286,6 +287,13 @@ ilo_get_compute_param(struct pipe_screen *screen,
> ptr = &val.images_supported;
> size = sizeof(val.images_supported);
> break;
> + case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
> + /* best case is SIMD32 */
> + val.subgroup_size = 32;
> +
> + ptr = &val.subgroup_size;
> + size = sizeof(val.subgroup_size);
> + break;
> default:
> ptr = NULL;
> size = 0;
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index 1ca997a..f6bef83 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -340,6 +340,7 @@ nvc0_screen_get_compute_param(struct pipe_screen *pscreen,
> enum pipe_compute_cap param, void *data)
> {
> uint64_t *data64 = (uint64_t *)data;
> + uint32_t *data32 = (uint32_t *)data;
> const uint16_t obj_class = nvc0_screen(pscreen)->compute->oclass;
>
> switch (param) {
> @@ -371,6 +372,9 @@ nvc0_screen_get_compute_param(struct pipe_screen *pscreen,
> case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE: /* c[], arbitrary limit */
> data64[0] = 4096;
> return 8;
> + case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
> + data32[0] = 32;
> + return 4;
> default:
> return 0;
> }
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
> index 42e681d..5494cb3 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
> @@ -637,6 +637,12 @@ static int r600_get_compute_param(struct pipe_screen *screen,
> return sizeof(uint32_t);
> case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
> break; /* unused */
> + case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
> + if (ret) {
> + uint32_t *subgroup_size = ret;
> + *subgroup_size = r600_wavefront_size(rscreen->family);
> + }
> + return sizeof(uint32_t);
> }
>
> fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param);
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
> index 6ce81d3..51fd016 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
> @@ -570,6 +570,26 @@ static inline unsigned r600_tex_aniso_filter(unsigned filter)
> /* else */ return 4;
> }
>
> +static inline unsigned r600_wavefront_size(enum radeon_family family)
> +{
> + switch (family) {
> + case CHIP_RV610:
> + case CHIP_RS780:
> + case CHIP_RV620:
> + case CHIP_RS880:
> + return 16;
> + case CHIP_RV630:
> + case CHIP_RV635:
> + case CHIP_RV730:
> + case CHIP_RV710:
> + case CHIP_PALM:
> + case CHIP_CEDAR:
> + return 32;
> + default:
> + return 64;
> + }
> +}
> +
> #define COMPUTE_DBG(rscreen, fmt, args...) \
> do { \
> if ((rscreen->b.debug_flags & DBG_COMPUTE)) fprintf(stderr, fmt, ##args); \
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index 8fabf5e..b50ae2b 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -699,7 +699,8 @@ enum pipe_compute_cap
> PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
> PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY,
> PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS,
> - PIPE_COMPUTE_CAP_IMAGES_SUPPORTED
> + PIPE_COMPUTE_CAP_IMAGES_SUPPORTED,
> + PIPE_COMPUTE_CAP_SUBGROUP_SIZE
> };
>
> /**
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150604/fcd1a264/attachment-0001.sig>
More information about the mesa-dev
mailing list