настоящее время у меня следующий код:Какой самый эффективный способ умножить 4 поплавка на 4 поплавка с помощью SSE?
float a[4] = { 10, 20, 30, 40 };
float b[4] = { 0.1, 0.1, 0.1, 0.1 };
asm volatile("movups (%0), %%xmm0\n\t"
"mulps (%1), %%xmm0\n\t"
"movups %%xmm0, (%1)"
:: "r" (a), "r" (b));
У меня есть прежде всего несколько вопросов:
(1), если бы я, чтобы выровнять массивы на границах 16 байт, будет он даже работать? Поскольку массивы выделены в стеке, верно ли, что их выравнивание почти невозможно?
видеть выбранный ответ на этот пост: Are stack variables aligned by the GCC __attribute__((aligned(x)))?
(2) Может ли код быть переработан на все, чтобы сделать его более эффективным? Что делать, если я помещаю как float-массивы в регистры, а не только один?
Благодаря
спасибо ; но как указано в этой статье http://stackoverflow.com/questions/841433/gcc-attributealignedx-explanation, кажется невозможным выровнять массивы, выделенные в стеке? (в отличие от глобальных массивов, выделенных в .data) – horseyguy
спасибо за исправление Bastien :) Banister ... можете ли вы попробовать и посмотреть, что произойдет? Если это связано с объяснением, это правильно, тогда было бы невозможно правильно выровнять такие вещи, как double, но они выравниваются. – Goz
да, я скоро ... У меня такое чувство, что связанное объяснение не так, как кажется всем в этом вопросе. всем спасибо! :) – horseyguy