[FFmpeg-devel] [PATCH v2 1/3] checkasm/diracdsp: test add_dirac_obmc

Kyosuke Kawakami kawakami150708 at gmail.com
Thu Nov 14 15:37:05 EET 2024


Thanks for feedback!

On Thu, Nov 14, 2024 at 9:40 PM Ronald S. Bultje <rsbultje at gmail.com> wrote:

> In terms of binary size, the above will triplicate nearly identical code in the binary, and that doesn't really seem necessary. You should be able to write the above out as a function and call it with appropriate xblen and func_index arguments (check_add_obmc(0, 8); check_add_obmc(1, 16); check_add_obmc(2, 32)) without duplicating these in the binary. Done for many tests, this reduces binary size and compile time significantly.

Sounds good. I'm going to implement these since I have some free time now.

> You can also get bonus points if you randomize yblen, since the bitstream allows multiple values for this (at least 4, 12, 16, 24, but possibly any number), so maybe 1 + (random % 64) would be a good choice?

I'll try this one too.

Thanks.
Kyosuke

On Thu, Nov 14, 2024 at 9:40 PM Ronald S. Bultje <rsbultje at gmail.com> wrote:
>
> Hi,
>
> thanks for adding the test! This looks pretty good. Minor suggestion:
>
> On Wed, Nov 13, 2024 at 5:39 PM Kyosuke Kawakami <kawakami150708 at gmail.com> wrote:
>>
>> +#define RANDOMIZE_DESTS(name, size)             \
>> +    do {                                        \
>> +        int i;                                  \
>> +        for (i = 0; i < size; ++i) {            \
>> +            uint16_t r = rnd();                 \
>> +            AV_WN16A(name##0 + i, r);           \
>> +            AV_WN16A(name##1 + i, r);           \
>> +        }                                       \
>> +    } while (0)
>> +
>> +#define RANDOMIZE_BUFFER8(name, size)         \
>> +    do {                                      \
>> +        int i;                                \
>> +        for (i = 0; i < size; ++i) {          \
>> +            uint8_t r = rnd();                \
>> +            name[i] = r;                      \
>> +        }                                     \
>> +    } while (0)
>> +
>> +#define OBMC_STRIDE 32
>> +
>> +#define CHECK_ADD_OBMC(func_index, yblen, xblen)                                              \
>> +    static void check_add_obmc ## xblen(void)                                                 \
>> +    {                                                                                         \
>> +        LOCAL_ALIGNED_8(uint8_t, src, [yblen * xblen]);                                       \
>> +        LOCAL_ALIGNED_16(uint16_t, dst0, [yblen * xblen]);                                    \
>> +        LOCAL_ALIGNED_16(uint16_t, dst1, [yblen * xblen]);                                    \
>> +        LOCAL_ALIGNED_8(uint8_t, obmc_weight, [yblen * OBMC_STRIDE]);                         \
>> +        DiracDSPContext h;                                                                    \
>> +        ff_diracdsp_init(&h);                                                                 \
>> +        if (check_func(h.add_dirac_obmc[func_index], "diracdsp.add_dirac_obmc_%d", xblen)) {  \
>> +            declare_func(void, uint16_t*, const uint8_t*, int, const uint8_t *, int);         \
>> +            RANDOMIZE_BUFFER8(src, yblen * xblen);                                            \
>> +            RANDOMIZE_DESTS(dst, yblen * xblen);                                              \
>> +            RANDOMIZE_BUFFER8(obmc_weight, yblen * OBMC_STRIDE);                              \
>> +            call_ref(dst0, src, xblen, obmc_weight, yblen);                                   \
>> +            call_new(dst1, src, xblen, obmc_weight, yblen);                                   \
>> +            if (memcmp(dst0, dst1, yblen * xblen))                                            \
>> +                fail();                                                                       \
>> +            bench_new(dst1, src, xblen, obmc_weight, yblen);                                  \
>> +        }                                                                                     \
>> +    }                                                                                         \
>> +
>> +CHECK_ADD_OBMC(0, 64, 8)
>> +CHECK_ADD_OBMC(1, 64, 16)
>> +CHECK_ADD_OBMC(2, 64, 32)
>> +
>> +void checkasm_check_diracdsp(void)
>> +{
>> +    check_add_obmc8();
>> +    check_add_obmc16();
>> +    check_add_obmc32();
>> +    report("diracdsp");
>> +}
>
>
> In terms of binary size, the above will triplicate nearly identical code in the binary, and that doesn't really seem necessary. You should be able to write the above out as a function and call it with appropriate xblen and func_index arguments (check_add_obmc(0, 8); check_add_obmc(1, 16); check_add_obmc(2, 32)) without duplicating these in the binary. Done for many tests, this reduces binary size and compile time significantly.
>
> You can also get bonus points if you randomize yblen, since the bitstream allows multiple values for this (at least 4, 12, 16, 24, but possibly any number), so maybe 1 + (random % 64) would be a good choice?
>
> If you don't care for the above, we can merge this as-is, they're merely suggestions, let me know what you think.
>
> Ronald


More information about the ffmpeg-devel mailing list