2016-08-03 1 views
2

Я играю с Apple Metal API вместе с так называемой simd библиотеки. Там такой код в заголовке:Что такое __ext_vector_type__ и simd?

typedef __attribute__((__ext_vector_type__(3))) float vector_float3; 

И мне очень интересно, что она делает и почему компилятор не разрешает ссылки на vector_float3 в аргументе функции, или в следующем порядке:

vector_float3 v; 
vector_float3& ref = v; 

ответ

3

это, как представляется, расширение лязг к GNU C vector extensions, где-то, как это было бы нормально:

typedef int v4si __attribute__ ((vector_size (16))); 

Почтовый индекс для ext_vector_type без указания лицевого направления/обратного отсчета the Clang docs. IDK, почему они добавили строку подчеркивания, поскольку она уже действует только в GNU C __attribute__.

Мое лучшее предположение, что это способ сообщить компилятору, что вы заботитесь только о значении первых трех элементов 4-разрядного регистра SIMD. Таким образом, это может потенциально сделать оптимизацию, которая оставляет разные мусора в высоком элементе, чем источник.


почему компилятор не разрешает ссылки на vector_float3

Работы для меня clang3.8. Попробуйте другой компилятор.

typedef __attribute__((__ext_vector_type__(3))) float vector_float3; 

int foo(vector_float3 &arg) { 
    vector_float3 v; 
    vector_float3& ref = v; // unused, but syntactically valid 
    return arg[0];   // return the low element of the vector, converted to an integer. GNU C vector-extensions syntax. 
} 

compiles to the following asm on the Godbolt compiler explorer

# targeting x86-64 SystemV ABI (so the first integer/pointer arg is in rdi) 
    cvttss2si  eax, dword ptr [rdi] 
    ret 
+0

спасибо за вашу помощь! как я вижу, это не очень популярная тема –

+0

@AndrewLavq: это ответ на ваш вопрос? Если это так, отметьте его как принятый с помощью флажка под стрелками вверх/вниз. Если нет, отредактируйте вопрос, чтобы он дал понять, что вы действительно пытаетесь спросить. –

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