none
Problem mit Intrinsics RRS feed

  • Frage

  • Hallo!

    Weiss jemand, was so der "recommended way" ist, einen 16-byte großen intrinsischen Datentyp (_m128) aus einem 12-byte großem unaligned Memory block zu lesen? In den intrinsics-headern gibt's zwar Funktionen _mm_maskmove_... zum teilweise Speichern von zB __m128i die, wie ich das verstehe, Deckungsgleich mit __m128 sind, aber nicht zum Laden.  Das heisst, das man entweder ziemlich umständlich einen 3-floats-lader schreiben müsste, der aus mehreren intrinsics besteht, oder aber, und das ist meine eigentliche Frage, man einfach einen float weit über die Grenzen des Speicherbereichs, von dem man lädt, hinausLIEST. Ich bin mir nicht sicher, ob das immer sicher ist, wenn der Bereich zB am ende des Prozesssegments ist - heisst, ob da nicht evtl. eine exception geschmissen werden kann und ob das verwenden von _mm_maskmove mit __m128 via typecast zulässig bzw. sinnvoll ist.

    • Bearbeitet Heiko Lewin Samstag, 27. Juli 2013 22:19 Ergänzung
    Samstag, 27. Juli 2013 21:52

Alle Antworten

  • Hallo Heiko,

    Kannst Du vielleicht _mm_maskmoveu_si128( _m128i d, _m128i n, char *p) verwenden?

    Gruss,

    Ionut 


    Ionut Duma, MICROSOFT Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 29. Juli 2013 14:57
    Moderator
  • Zum schreiben, vielleicht. Ich hab noch nicht getestet, ob dann die byte-order eine Rolle spielt. ints sind ja little-endian...
    • Bearbeitet Heiko Lewin Montag, 29. Juli 2013 15:02 typo
    Montag, 29. Juli 2013 15:02
  • Hab das mal ausprobiert. Scheint so, als ob da keine endianess-conversion vorgenommen wird.

    __m128 fVec = _mm_set_ps(5,6,7,0);
    __m128i mask = _mm_set_epi8(0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
    _mm_maskmoveu_si128(*(__m128i*)&fVec, mask, buffer);

    kopiert die ersten drei float-Werte in den Buffer mit dem selben Ergebnis, das auch _mm_storeu_ps liefert - abgesehen von der Länge natürlich.

    Zum Laden von 3 floats gibt's unter den Advanced Vector Extensions (<immintrin.h>) Funktionen, die ich aber leider nicht Nutzen kann, weil mein CPU zu alt ist. Muss ich wohl warten.

    Bisher regle ich das Laden von 3 floats durch das zusammensetzen von mehreren Operationen. So ist es jedenfalls ausgeschlossen, dass alles wegen einer Speicher-Exception hängen bleibt...

    Mittwoch, 31. Juli 2013 01:02