[Mesa-dev] [PATCH 2/3] radeon/compute: Implement PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS

Alex Deucher alexdeucher at gmail.com
Mon Jun 2 13:16:23 PDT 2014


On Sat, May 31, 2014 at 7:13 AM, Bruno Jimenez <brunojimen at gmail.com> wrote:
> On Fri, 2014-05-30 at 19:33 -0400, Alex Deucher wrote:
>> On Fri, May 30, 2014 at 11:31 AM, Bruno Jiménez <brunojimen at gmail.com> wrote:
>> > The data has been extracted from:
>> > AMD Accelerated Parallel Processing OpenCL Programming Guide (rev 2.7)
>> > Appendix D: Device Parameters
>>
>> You should add a query for the number of compute units to the
>> RADEON_INFO ioctl and then just ask the kernel how many CUs/SIMDs the
>> hw has.  This will properly handle all boards (harvest, etc.) since we
>> can read the actual number of CUs off the GPU.
>>
>> Alex
>
> Hi,
>
> At first I tried to do so (as for the maximum clock frequency), but I
> couldn't find how to query that value, nor many docs about what I could
> ask the kernel for.
>
> I think I have found now the appropiate docs, and I will try again to
> query the kernel later.

You'd need to add a new query.  It doesn't look like we expose this
yet.  The attached untested patch should mostly do the trick.

Alex


>
> Sorry for any inconvenience.
> Bruno
>
>>
>> > ---
>> >  src/gallium/drivers/radeon/r600_pipe_common.c | 90 +++++++++++++++++++++++++++
>> >  1 file changed, 90 insertions(+)
>> >
>> > diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
>> > index 70c4d1a..c4abacd 100644
>> > --- a/src/gallium/drivers/radeon/r600_pipe_common.c
>> > +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
>> > @@ -422,6 +422,89 @@ const char *r600_get_llvm_processor_name(enum radeon_family family)
>> >         }
>> >  }
>> >
>> > +static uint32_t radeon_max_compute_units(enum radeon_family family)
>> > +{
>> > +       switch (family) {
>> > +       case CHIP_CEDAR:
>> > +               return 2;
>> > +
>> > +       /* Redwood PRO2: 4
>> > +        * Redwood PRO:  5
>> > +        * Redwood XT:   5 */
>> > +       case CHIP_REDWOOD:
>> > +               return 4;
>> > +
>> > +       /* Juniper LE:  9
>> > +        * Juniper XT: 10 */
>> > +       case CHIP_JUNIPER:
>> > +               return 9;
>> > +
>> > +       /* Cypress LE:  14
>> > +        * Cypress PRO: 18
>> > +        * Cypress XT:  20 */
>> > +       case CHIP_CYPRESS:
>> > +               return 14;
>> > +
>> > +       case CHIP_HEMLOCK:
>> > +               return 40;
>> > +
>> > +       /* XXX: is Zacate really equal to Ontario?
>> > +        * Zacate E-350: 2
>> > +        * Zacate E-240: 2
>> > +        * Ontario C-50: 2
>> > +        * Ontario C-30: 2 */
>> > +       case CHIP_PALM:
>> > +               return 2;
>> > +
>> > +       /* Caicos:      2
>> > +        * Seymour LP:  2
>> > +        * Seymour PRO: 2
>> > +        * Seymour XT:  2
>> > +        * Seymour XTX: 2 */
>> > +       case CHIP_CAICOS:
>> > +               return 2;
>> > +
>> > +       /* Turks PRO:    6
>> > +        * Turks XT:     6
>> > +        * Whistler LP:  6
>> > +        * Whistler PRO: 6
>> > +        * Whistler XT:  6 */
>> > +       case CHIP_TURKS:
>> > +               return 6;
>> > +
>> > +       /* Barts LE:      10
>> > +        * Barts PRO:     12
>> > +        * Barts XT:      14
>> > +        * Blackcomb PRO: 12 */
>> > +       case CHIP_BARTS:
>> > +               return 10;
>> > +
>> > +       /* Cayman PRO: 22
>> > +        * Cayman XT:  24
>> > +        * Cayman Gemini: 48 */
>> > +       case CHIP_CAYMAN:
>> > +               return 22;
>> > +
>> > +       /* Verde PRO:  8
>> > +        * Verde XT:  10 */
>> > +       case CHIP_VERDE:
>> > +               return 8;
>> > +
>> > +       /* Pitcairn PRO: 16
>> > +        * Pitcairn XT:  20 */
>> > +       case CHIP_PITCAIRN:
>> > +               return 16;
>> > +
>> > +       /* Tahiti PRO: 28
>> > +        * Tahiti XT:  32 */
>> > +       case CHIP_TAHITI:
>> > +               return 28;
>> > +
>> > +       default:
>> > +               return 1;
>> > +       }
>> > +}
>> > +
>> >  static int r600_get_compute_param(struct pipe_screen *screen,
>> >          enum pipe_compute_cap param,
>> >          void *ret)
>> > @@ -519,6 +602,13 @@ static int r600_get_compute_param(struct pipe_screen *screen,
>> >                 }
>> >                 return sizeof(uint32_t);
>> >
>> > +       case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
>> > +               if (ret) {
>> > +                       uint32_t *max_compute_units = ret;
>> > +                       *max_compute_units = radeon_max_compute_units(rscreen->family);
>> > +               }
>> > +               return sizeof(uint32_t);
>> > +
>> >         default:
>> >                 fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param);
>> >                 return 0;
>> > --
>> > 1.9.3
>> >
>> > _______________________________________________
>> > mesa-dev mailing list
>> > mesa-dev at lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-drm-radeon-add-query-for-number-of-active-CUs.patch
Type: text/x-diff
Size: 10273 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140602/7095a277/attachment.patch>


More information about the mesa-dev mailing list