[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