Ich schreibe ein Programm in C, das einige schnelle mathematische Berechnungen durchführen muss. Ich verwende Inline-SSE-Assembler-Anweisungen, um eine SIMD-Aktion zu erhalten (mit gepackten Gleitkommazahlen mit doppelter Genauigkeit). Ich kompiliere mit GCC unter Linux.Erhalten Sie GCC, um ein SSE-Register in einer Funktion zu erhalten, die Inline-Asm verwendet
Ich bin in einer Situation, in der ich einige Daten durchlaufen muss, und ich verwende einen konstanten Faktor in meinen Berechnungen. Ich möchte diesen Faktor während der Schleife in einem sicheren Register versteckt halten, so dass ich ihn nicht jedes Mal neu laden muss.
mit einigem Code Zur Klarstellung:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for(int i = 0, i<N; i++){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
Ich habe etwas mit dem "Register" Stichwort versucht zu tun. Aber wenn ich mich nicht irre, sieht es so aus, als könnte ich nur einen Zeiger auf diese Struktur (in einem allgemeinen Register) bewahren. Dies müsste bei jeder Wiederholung deferenziert werden und wertvolle Zeit verschwenden.
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
Ich mag nicht nur davon ausgehen, dass GCC wird die Änderung nicht XMM1 zu registrieren, ist es zu viel von einem „Dämonen aus der Nase fliegt“ Art der Sache :-). Ich hoffe, es gibt einen richtigen Weg, dies zu tun.