• corroded@lemmy.world
    link
    fedilink
    arrow-up
    39
    ·
    1 year ago

    I have the utmost respect for the ffmpeg developers; writing ASM is a skill I do not possess. I do have to wonder, though, would it be easier for cross-platform compatibility to write in C instead. I have always understood that C generally compiles almost directly to assembly with little to no abstraction overhead, and it would not require platform-specific ASM code. What is the logic in choosing ASM over C? I have no doubt there is a good reason.

    • MigratingApe@lemmy.dbzer0.com
      link
      fedilink
      arrow-up
      30
      ·
      1 year ago

      The reason is SIMD instructions / vectorized assembly instructions with consideration for delay slots, instruction latency, memory access times etc., for which GCC and Clang optimizers are both terrible and cannot automatically transform C code to them in any but simple cases.

      This is also a reason why specialized DSP processors with SIMD capabilities have dedicated proprietary compilers for them.

    • Kushan@lemmy.world
      link
      fedilink
      English
      arrow-up
      29
      arrow-down
      1
      ·
      1 year ago

      In 99 cases out of 100, you won’t be able to hand craft assembly better than a good compiler can - partly due to compilers being much better and partly due to the skill level required. 20 or 30 years ago compilers weren’t as good and a reasonably competent person could craft more optimised assembly but these days compilers are pretty damn good and you need some extra level of ability to best the compiler.

      However, there’s still that 1 time out of 100 and given how resource intensive ffmpeg is, it’s worth spending that extra time to hyper optimise the code because it’ll pay off massively.

    • ttmrichter@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      I have always understood that C generally compiles almost directly to assembly with little to no abstraction overhead, and it would not require platform-specific ASM code.

      You have always understood incorrectly then. I’d recommend a trip over to Godbolt and take a look at the assembler output from C code. Play around with compiler options and see the (often MASSIVE!) changes. That alone should tell you that it doesn’t compile “almost directly to assembly”.

      But then note something different. Count the different instructions used by the C compiler. Then look at the number of instructions available in an average CISC processor. Huge swaths of the instruction set, especially the more esoteric, but performance-oriented instructions for very specific use cases, are typically not touched by the compiler.

      In the very, very, very ancient days of C the C compiler compiled almost directly to assembly. Specifically PDP-11 assembly. And any processor that was similar to the PDP-11 had similar mappings available. This hasn’t been the case, however, likely longer than you’ve been alive.