В документе GCC here указано использование _buitin_prefetch.Каков эффект второго аргумента в _builtin_prefetch()?
Третий аргумент совершенен. Если это 0, компилятор генерирует команду prefetchtnta (% rax) Если это 1, компилятор генерирует команду prefetcht2 (% rax) Если это 2, компилятор генерирует команду prefetcht1 (% rax) Если это 3 (по умолчанию) , компилятор генерирует команду prefetcht0 (% rax).
Если мы изменим третий аргумент, код операции уже изменился соответствующим образом.
Но второй аргумент, похоже, не имеет никакого эффекта.
__builtin_prefetch(&x,1,2);
__builtin_prefetch(&x,0,2);
__builtin_prefetch(&x,0,1);
__builtin_prefetch(&x,0,0);
Выше образец фрагмент кода, который генерируется:
Ниже сборка:
27: 0f 18 10 prefetcht1 (%rax)
2a: 48 8d 45 fc lea -0x4(%rbp),%rax
2e: 0f 18 10 prefetcht1 (%rax)
31: 48 8d 45 fc lea -0x4(%rbp),%rax
35: 0f 18 18 prefetcht2 (%rax)
38: 48 8d 45 fc lea -0x4(%rbp),%rax
3c: 0f 18 00 prefetchnta (%rax)
можно наблюдать изменение в опкоды WRT 3-го аргумента. Но даже если я изменил второй аргумент (который указывает чтение или запись), код сборки остается тем же. < 27,2a> и < 2e, 31>. Так что это не дает никакой информации машине. Тогда в чем смысл второго аргумента?
Документация очень Чисто. Какие команды он генерирует для определенной архитектуры, конечно, зависит от доступных функций. Для некоторых архитектур он вообще не будет генерировать никаких инструкций. Итак, вы проверили, какие инструкции предварительной выборки заданы для вашей целевой цели x86? Что они на самом деле делают? И как они связаны с аргументами? Инструкции по эксплуатации для Intel и AMD доступны для бесплатной загрузки. – Olaf