• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C i wstawki Assembler SIMD, problemy z pamięcią

VPS Starter Arubacloud
0 głosów
377 wizyt
pytanie zadane 12 kwietnia 2018 w Assembler przez Isild Użytkownik (580 p.)

Witam,
napisałem program w C ze wstawkami z Assemblera. Trochę poczytałem o SSE i zabrałem się do pracy, ale wyskakuje mi następujący błąd w funkcji addDIMD:

asm operand 1 probably doesn't match constraints

#include <stdio.h>
#include <stdlib.h>

#define sizeOfNumbers 10
#define randSize 1000       

struct vector 
{
    float x0;
    float x1;
    float x2;
    float x3;
};

struct vector v1[sizeOfNumbers];
struct vector v2[sizeOfNumbers];
struct vector vAdd[sizeOfNumbers];

float randomNumbers()
{
    for(int i=0; i<sizeOfNumbers; i++)
    {
        v1[i].x0 = (float)(rand()%randSize)/100;
        v1[i].x1 = (float)(rand()%randSize)/100;
        v1[i].x2 = (float)(rand()%randSize)/100;
        v1[i].x3 = (float)(rand()%randSize)/100;

        v2[i].x0 = (float)(rand()%randSize)/100;
        v2[i].x1 = (float)(rand()%randSize)/100;
        v2[i].x2 = (float)(rand()%randSize)/100;
        v2[i].x3 = (float)(rand()%randSize)/100;
    }
}

struct vector addSIMD(struct vector a, struct vector b, struct vector sum)
{
    printf("dodawanko simd");
    asm(
        "movaps %1, %%xmm0 \n\t"    
        "movaps %2, %%xmm1 \n\t"
        "addps %%xmm0, %%xmm1 \n\t"
        "movaps %%xmm1, %0 \n\t"
        :"=r"(sum)  
        :"r"(a),    
        "r"(b)      
    );

    return sum;
}

int main(void)
{   
    randomNumbers();

    for(int i=0; i<sizeOfNumbers; i++)
    {
        vAdd[i] = addSIMD(v1[i],v2[i],vAdd[i]);
    }

    return 0;
}

Po zmianie "r" na "m"(z rejestrów na pamięć), program się kompiluje, ale jest nadal naruszenie ochrony pamięci(zrzut pamięci).
O co może chodzić?

Dodam że tak tworzę mój program:

gcc test.c -c -o test.o

gcc test.o -o test
1
komentarz 12 kwietnia 2018 przez adrian17 Ekspert (344,100 p.)

napisałem program w C ze wstawkami z Assemblera. Trochę poczytałem o SSE 

Chcesz się nauczyć SSE, czy wstawek asemblera? Jeśli SSE, to nie ma potrzeby się grzebać z asmem, bo kompilatory dostarczają magiczne funkcje kompilujące się w odpowiednie instrukcje SSE.

Twoje addSIMD można zapisać tak:

#include <xmmintrin.h>
void addSIMD(struct vector *a, struct vector *b, struct vector *sum)
{
    __m128 a1 = _mm_load_ps((float*)a);
    __m128 b1 = _mm_load_ps((float*)b);
    __m128 wynik = _mm_add_ps(a1, b1);
    _mm_store_ps((float*)sum, wynik);
}

Które skompiluje się do ładnego (i nawet lepszego niż Twój asm, bo trochę krótszy):

addSIMD:
  movaps xmm0, XMMWORD PTR [rdi]
  addps xmm0, XMMWORD PTR [rsi]
  movaps XMMWORD PTR [rdx], xmm0
  ret

https://godbolt.org/g/BJ6Fip

komentarz 12 kwietnia 2018 przez NIMuser Stary wyjadacz (11,030 p.)

....bo kompilatory dostarczają magiczne funkcje kompilujące się w odpowiednie instrukcje SSE.

Chciałem to napisać ;)  Wiele języków wyższego poziomu nie ma takich możliwości i np. w Javie czy Python jest to trudne lub niemożliwe do wykonania 

komentarz 12 kwietnia 2018 przez Isild Użytkownik (580 p.)

@adrian17,

Muszę się nauczyć takiej składni (x86 32bit), bo będę używać jej na zajęciach.
Tak wiem, że są języki wyższego poziomu i mają takie opcje.
Chcę się nauczyć i wstawek i SSE. Moje zajęcia też na mnie wymuszają że muszę się tego nauczyć, a poznanie assemblera może się przydać, żeby móc lepiej programować.

Myśleć niskopoziomowo, pisać wysokopoziomowo.

Głównie chodzi mi o znalezienie błędu w moim kodzie, ale fajnie by było jak byś dodał komentarz do tego co napisałeś ;)

komentarz 12 kwietnia 2018 przez adrian17 Ekspert (344,100 p.)

Głównie chodzi mi o znalezienie błędu w moim kodzie, ale fajnie by było jak byś dodał komentarz do tego co napisałeś ;)

Z wstawką nie pomogę, bo nigdy ich nie używałem - właśnie dlatego, że do zastosowań SIMD w praktyce się ich nie używa, bo są funkcje z xmmintrin.h :/

komentarz 12 kwietnia 2018 przez Isild Użytkownik (580 p.)
Okej rozumiem, dzięki za odzew :D
komentarz 13 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Wszelkie asemblerowe wstawki, raczej wydzielaj do odrębnych plików później konsolidowanych. W przeciwnym razie skazujesz się na niepotrzebną wiedzę o gospodarce rejestrami danego kompilatora, sposobie wykonywania przez niego wywołania, sposobie wykonywania prologu i epilogu funkcji.

Ale rozumiem .. kazali :/

PS. O ile pamiętam za tym asm'em powinno być volatile bo sprytny kompilator potrafi usunąć sekcję asm. Ale to już doczytasz kiedy to robi.

1 odpowiedź

0 głosów
odpowiedź 12 kwietnia 2018 przez NIMuser Stary wyjadacz (11,030 p.)
edycja 12 kwietnia 2018 przez NIMuser

Dużo nie pomogę (nie znam się na wstawkach asm), ale...

Nie rozumiem dlaczego przekazujesz do funkcji AddSIMD wektor który ma być wektorem wynikowym, zwracanym przez tą funkcję?

Nie mam pewności, ale chyba na początku metody generującej losowe wartości brakuje czegoś na wzór:

srand((unsigned)time(0));

Nie wiem co robi koniec linii i tabulacja (\n\t ) w wstawkach asm? :)

Kolejna sprawa, czy nie powinny tam być na końcu średniki? (tylko pytam)

 

Jak uda się Tobie poprawić błędy, to pochwal się wynikami, czy uzyskałeś jakiś postęp w stosunku do "czystego" kodu C++ ?

 

komentarz 12 kwietnia 2018 przez adrian17 Ekspert (344,100 p.)

Jak uda się Tobie poprawić błędy, to pochwal się wynikami, czy uzyskałeś jakiś postęp w stosunku do "czystego" kodu C++ ?

(to C)

komentarz 12 kwietnia 2018 przez NIMuser Stary wyjadacz (11,030 p.)
Czy to Ansi C czy C++ to sprawa drugorzędna, ważne jest czy kod wykona się szybciej, to jest główny cel robienia wstawek asm.
komentarz 12 kwietnia 2018 przez Isild Użytkownik (580 p.)

A tak zapomniałem dokleić

srand((unsigned)time(0));

(\n\t ) we wstawkach asemblera oznacza nową linię, to taki trochę ";" jak w C

A do funkcji przekazuje wektor wynikowy, bo narazie nie chcę mieszać za bardzo w pamięci i nadużywać nadpisywania wyjścia. Wyczytałem, że nie nadużywanie tego może uniemożliwić optymalizację kodu. Zacznę to używać dopiero jak będę się lepiej czuć w assemblerze.

komentarz 13 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Akurat w tym kodzie agresywna optymalizacja i wektoryzacja poprzez przełącznik kompilatora, da lepszy wynik przy minimum pracy.

Podobne pytania

+2 głosów
3 odpowiedzi 491 wizyt
pytanie zadane 12 czerwca 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 15 listopada 2020 w Assembler przez Wookiee Użytkownik (980 p.)
+1 głos
2 odpowiedzi 596 wizyt
pytanie zadane 19 stycznia 2017 w Assembler przez niezalogowany

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...