Предварительная выборка двойного члена класса требует приведения к типу char *?

У меня есть класс, который я использую _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 *’

Так как мне предварительно выбрать этого ученика?

3

Решение

Если вы прочитали описание для _mm_prefetch() с сайта, на который вы ссылаетесь, есть:

void _mm_prefetch (char const* p, int i)

Извлечь строку данных из памяти, которая содержит адрес p, в место в иерархии кэша, указанное в подсказке локальности i.

Таким образом, вам нужно передать адрес переменной, которую вы хотите. Для этого вам нужно передать в функцию либо адрес ссылки на член класса, либо указатель на него.

Самое простое решение — изменить getDouble() чтобы вернуть ссылку, а затем вы можете использовать:

_mm_prefetch((char*)(&myOb.getDouble()), _MM_HINT_T0);
4

Другие решения

_mm_prefetch загружает строку кеша по адресам памяти в кеш. Попытка привести удвоение к указателю не работает, так как они не являются совместимыми типами. Кроме того, вы не можете просто позвонить _mm_prefetch на адресе возвращаемого значения getDouble, поскольку это не будет адрес искомого экземпляра, это будет локальный или временный адрес (который, по-видимому, уже «близок» к процессору). Кроме того, просто вызов getDouble загрузит адрес, потому что вы обращаетесь к члену внутри функции.

Скорее всего, ваш лучший вариант (в зависимости от размера MyClass и размер строки кеша вашей цели) — загрузить весь объект в кеш, вот так:

_mm_prefetch(&myOb, _MM_HINT_T0);

Предварительная выборка также обычно наиболее эффективна, когда вы можете сделать это несколько раньше, чем выполняете операцию с адресом памяти. Например, делать:

_mm_prefetch(&myOb, _MM_HINT_T0);
myObj.getDouble();

Производительность не пойдет на пользу (на самом деле это может повредить).

0

По вопросам рекламы [email protected]