Как мне предварительно выбрать указатель в C, ориентируясь на AMD Opteron 6168? - PullRequest
0 голосов
/ 14 октября 2010

Я пишу многопоточную программу на C, в которой одно ядро ​​периодически захватывает элемент из заголовка связанного списка, в то время как другие ядра добавляют элементы в конец списка (используя магию CAS для безопасности потоков, кто-то другой при условии, чтодля меня).Похоже, что моя программа будет работать быстрее, если ядро, берущее элемент из заголовка списка, просто инициирует предварительную выборку для следующего элемента, который обязательно будет в кеше другого ядра.

В настоящее время я нацеливаюсь наAMD Opteron 6168, компилируемый с gcc для Debian Linux: я пытался найти документацию для этого, но я нахожусь в незнакомой воде.Все, что я могу найти, это использовать -O3 для включения предварительной выборки, вставляемой компилятором (я думаю, для циклов), и некоторые упоминания имен инструкций предварительной выборки AMD, таких как PREFETCHW.

Я не знаю, как найти ссылку на то, что япосле или как вставить такой оператор в C, может быть, как блок сборки?

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

gcc поставляется с некоторыми встроенными функциями для этого.Вы можете сделать

__builtin_prefetch(&yourData);
2 голосов
/ 14 октября 2010

Проверьте документы по архитектуре Intel.

В VC вы должны иметь возможность сделать что-то подобное

asm
{
  prefetch POINTER_NAME
}

В GCC -

asm("prefetch %0", POINTER_NAME); //May have syntax slightly off

I 'мы уже просмотрели это раньше.

...