2015-06-08 1 views
3

У меня есть класс, который я использую _mm_prefetch() для предварительного запроса на cacheline, содержащий элемент класса, типа двойной:Предварительная выборка двойного члена класса требует кастинга на char *?

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 жалуется:

error: invalid cast from type 'double' to type 'char*'

Итак, как мне предварительно выбрать этот класс?

+0

Будет ли '(char *) (& myOb.getDouble()) работать? Предполагая, что 'getDouble()' возвращает ссылку на 'dbl' – Noel

+0

@Noel getDouble() просто возвращает значение – user997112

+1

, вам необходимо передать _mm_prefetch указатель, то есть адрес' dbl'. Я бы предложил изменить ваш getter в 'MyClass' на' double & getDouble() {return dbl;} ', если это возможно для вас – Noel

ответ

4

Если вы читали описание _mm_prefetch() с сайта вы связаны с ним имеет:

void _mm_prefetch (char const* p, int i) 

Fetch the line of data from memory that contains address p to a location in the cache heirarchy specified by the locality hint i.

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

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

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

Таким образом, невозможно передать адрес члена класса внутри переменной? (У меня есть большой объект в начале моего класса, который я не хочу префикс) – user997112

+1

@ user997112 Если вы измените 'getDouble()', чтобы вернуть ссылку, вы можете использовать эту функцию. Я только что отредактировал свой ответ, чтобы включить это. – NathanOliver

+0

Спасибо, да, просто видел это, и я добавил для этого метод. – user997112

0

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

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

_mm_prefetch(&myOb, _MM_HINT_T0); 

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

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

Не пригодится производительность (на самом деле это может повредить).

+0

Да, это называется «расстояние предварительной выборки», – user997112

Смежные вопросы