On Tue, 10 Sept 2024 at 13:07, Levi Zim <rsworktech@xxxxxxxxxxx> wrote: > > Hi there, > > First time posting here so sorry if I posted to the wrong lists. > > I have a question about the std::hardware_destructive_interference_size > constant value on riscv64. > > As documented on cppreference[1], hardware_destructive_interference_size > provide a portable way to access the L1 data cache line size. And > Raymond mentions hardware_destructive_interference_size tells you > (basically) the size of a cache line in his blog[2]. > > But this value is 32 for riscv64, which seems wrong to me because IIRC > many riscv64 cpus have cacheline of size 64. > > This value is defined to be __GCC_DESTRUCTIVE_SIZE. And Clang takes this > value from gcc when implementing their __GCC_DESTRUCTIVE_SIZE. In > general I am not familiar with the gcc code base and didn't find the > definition of this constant for riscv64 target. So I would really > appreciate it if anyone could explain why this value is 32 for riscv64. Because the riscv64 target maintainers didn't define any specific value for their target. The predefined macro is defined here: gcc/c-family/c-cppbuiltin.cc: builtin_define_with_int_value ("__GCC_DESTRUCTIVE_SIZE", Which uses the param_destruct_interfere_size variable which can be defined on the command line using --param and if not defined, uses the l1 cache size (which can also be defined with --param): /* Check that the hardware interference sizes are at least alignof(max_align_t), as required by the standard. */ const int max_align = max_align_t_align () / BITS_PER_UNIT; if (OPTION_SET_P (param_destruct_interfere_size)) { if (param_destruct_interfere_size < max_align) error ("%<--param destructive-interference-size=%d%> is less than " "%d", param_destruct_interfere_size, max_align); else if (param_destruct_interfere_size < param_l1_cache_line_size) warning (OPT_Winterference_size, "%<--param destructive-interference-size=%d%> " "is less than %<--param l1-cache-line-size=%d%>", param_destruct_interfere_size, param_l1_cache_line_size); } else if (param_destruct_interfere_size) /* Assume the internal value is OK. */; else if (param_l1_cache_line_size >= max_align) param_destruct_interfere_size = param_l1_cache_line_size; /* else leave it unset. */ The L1 cache size also isn't defined explicitly for RISC-V 64 so it uses the default value of 32: gcc/params.opt:Common Joined UInteger Var(param_l1_cache_line_size) Init(32) Param Optimization Please file a bug for the RISC-V target asking them to set it correctly. In the meanwhile, you can use --param to set your desired value. > > And here's a godbolt link: https://godbolt.org/z/avWMbr8dK > > [1]: > https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size > [2]: https://devblogs.microsoft.com/oldnewthing/20230424-00/?p=108085 > [3]: https://github.com/llvm/llvm-project/pull/89446#issuecomment-2070649367 > > > Cheers, > Levi >