2016-05-07 5 views
0

Могу ли я определить указатель на функцию для _mm_load_ps, _mm_store_ps и т.п.?intel intrinsics - указатели функций для загрузки/хранения

Я думаю о чем-то вроде

float* x0; //param 
... 
__m128 (*load_x0)(float const *mem); 
if((unsigned long)x0 & 15) load_x0 = &_mm_loadu_ps; 
else load_x0 = &_mm_load_ps; 

, но это приводит к

неопределенная ссылка на _mm_load_ps

неопределенная ссылка на _mm_loadu_ps

ответ

2

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

Рассмотрим делать обертки, подобные этим:

__m128 my_mm_load_ps(float const *mem) 
{ 
    return _mm_load_ps(mem); 
} 

__m128 my_mm_loadu_ps(float const *mem) 
{ 
    return _mm_loadu_ps(mem); 
} 

Вы можете использовать в качестве обертки указателей на функции:

__m128 (*load_x0)(float const *mem); 
if((unsigned long)x0 & 15) load_x0 = &my_mm_loadu_ps; 
else load_x0 = &my_mm_load_ps; 
+0

Интересно. Поэтому я получаю от использования выравниваемой нагрузки, когда это возможно, но вам нужно заплатить дополнительные накладные расходы за дополнительный вызов функции. Вы думаете, что окупится? – User1291

+2

@ User1291 Нет, не будет. Нет никакой разницы между выровненными и невыложенными инструкциями (при использовании на выровненных данных) на всех, кроме нескольких очень старых микроархитектур. – fuz

+1

@ User1291 Просто используйте неуравновешенные нагрузки для всего, и все будет хорошо. Контрольный показатель, когда есть сомнения. – fuz

-1

вы в том числе он файлы ader для этих функций?

«xmmintrin.h» является подходящим заголовок для этих векторов нагрузок

+0

Конечно. (Ну, на самом деле, используя pmmintrin.h). Я удаляю присваивания '' load_x0'' и упрямо использую '' _mm_loadu_ps'' всюду, такой ошибки нет. – User1291

+2

Если это внутренняя среда компилятора, то у них нет адреса, и вы не можете ссылаться на них. –

+0

И я не думаю, что есть способ обойти это ограничение, нет? Это ... неудовлетворительно. В любом случае, спасибо. Вы хотите уточнить, чтобы я мог принять это как ответ? – User1291

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