Я программирую встроенный powerpc 32 с 32-байтным 8-полосным ассоциативным кэшем команд L2. Чтобы избежать обхода кеша, мы выравниваем функции таким образом, чтобы текст набора функций, называемых на частоте высокой частоты (думаю, код прерывания) заканчивается в отдельных наборах кешей. Мы делаем это, вставляя фиктивные функции по мере необходимости, например.
void high_freq1(void)
{
...
}
void dummy(void)
{
__asm__(/* Silly opcodes to fill ~100 to ~1000 bytes of text segment */);
}
void high_freq2(void)
{
...
}
Это выглядит как уродливое и неоптимальное. Что я хотел бы сделать, это
- полностью избегать
__asm__
и использовать чистый C89 (возможно, C99) - найдите способ создания нужного разделителя
dummy()
, который оптимизатор GCC не коснется - размер спейсера
dummy()
должен быть сконфигурирован как кратный 4 байтам. Типичные разделители составляют от 260 до 1000 байтов. - должно быть возможным для набора из примерно 50 функций из 500 функций.
Я также хочу изучить совершенно новые методы размещения набора выбранных функций таким образом, чтобы они не отображались в одинаковые строки кеша. Может ли компоновщик script сделать это?