У меня есть класс, который я использую _mm_prefetch()
для предварительного запроса строки кэша, содержащей член класса, типа double:
class MyClass{
double getDouble(){
return dbl;
}
//other members
double dbl;
//other members
};
_mm_prefetch()
подпись это:
void _mm_prefetch (char const* p, int i)
Но, когда я делаю:
_mm_prefetch((char*)(myOb.getDouble()), _MM_HINT_T0);
GCC жалуется:
ошибка: неверное приведение типа ‘double’ к типу ‘char *’
Так как мне предварительно выбрать этого ученика?
Если вы прочитали описание для _mm_prefetch()
с сайта, на который вы ссылаетесь, есть:
void _mm_prefetch (char const* p, int i)
Извлечь строку данных из памяти, которая содержит адрес p, в место в иерархии кэша, указанное в подсказке локальности i.
Таким образом, вам нужно передать адрес переменной, которую вы хотите. Для этого вам нужно передать в функцию либо адрес ссылки на член класса, либо указатель на него.
Самое простое решение — изменить getDouble()
чтобы вернуть ссылку, а затем вы можете использовать:
_mm_prefetch((char*)(&myOb.getDouble()), _MM_HINT_T0);
_mm_prefetch
загружает строку кеша по адресам памяти в кеш. Попытка привести удвоение к указателю не работает, так как они не являются совместимыми типами. Кроме того, вы не можете просто позвонить _mm_prefetch
на адресе возвращаемого значения getDouble, поскольку это не будет адрес искомого экземпляра, это будет локальный или временный адрес (который, по-видимому, уже «близок» к процессору). Кроме того, просто вызов getDouble загрузит адрес, потому что вы обращаетесь к члену внутри функции.
Скорее всего, ваш лучший вариант (в зависимости от размера MyClass
и размер строки кеша вашей цели) — загрузить весь объект в кеш, вот так:
_mm_prefetch(&myOb, _MM_HINT_T0);
Предварительная выборка также обычно наиболее эффективна, когда вы можете сделать это несколько раньше, чем выполняете операцию с адресом памяти. Например, делать:
_mm_prefetch(&myOb, _MM_HINT_T0);
myObj.getDouble();
Производительность не пойдет на пользу (на самом деле это может повредить).