Wie kann ich Altivec-Befehle nutzen?

Dieses Thema im Forum "Mac OS X Entwickler, Programmierer" wurde erstellt von -Nuke-, 21.02.2004.

  1. -Nuke-

    -Nuke- Thread Starter MacUser Mitglied

    Beiträge:
    2.135
    Zustimmungen:
    15
    MacUser seit:
    13.09.2003
    Hi.

    Ich möchte gerne in meinen Programmen Altivec nutzen, wenn möglich.

    Nur was muss ich includieren, damit ich Befehle wie vec_add, usw. nutzen kann?

    In einem HTML-Dokument von OSX stand etwas von altivec.h. Nur leider wird diese nicht gefunden, wenn ich #include <altivec.h> nutze.

    Kann mir einer helfen?

    Danke.
     
  2. mdev

    mdev MacUser Mitglied

    Beiträge:
    24
    Zustimmungen:
    0
    MacUser seit:
    22.08.2002
    Selektiere dein Projekt in XCode (das oberste Ikon in "Groups & Files"), und waehle "Project -> Get Info".

    Dort den Reiter "Styles" waehlen. In der sich dann oeffnenden Schublade "Settings" unter "GNU C/C++ Compiler->Language" die Checkbox "Enable Altivec Extensions" einschalten.

    Vor dem Rebuild noch deinen "#include <altivec.h>" Loeschen, und dran denken, dasz du "Enable Altivec Extensions" fuer jeden Build Style, den du Benutzt separat Einschalten musst.

    Falls du XCode nicht benutzen solltest, so musst du beim Compilieren mit dem gcc die Option "-faltivec" benutzen, um die Altivec-Erweiterungen einzuschalten.
     
  3. -Nuke-

    -Nuke- Thread Starter MacUser Mitglied

    Beiträge:
    2.135
    Zustimmungen:
    15
    MacUser seit:
    13.09.2003
    Hmm,

    und wo sind die Befehle wie vec_add definiert?
     
  4. mdev

    mdev MacUser Mitglied

    Beiträge:
    24
    Zustimmungen:
    0
    MacUser seit:
    22.08.2002
    Bei diesen Befehlen handelt es sich um Spracherweiterungen des Compilers selbst, fuer die keine weiteren Bibliotheken benoetigt werden.

    Dokumentation findet sich unter:
    [DLMURL]http://e-www.motorola.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf[/DLMURL]

    Eine Einfuehrung unter:
    [DLMURL]http://www.simdtech.org/apps/group_public/download.php/26/Altivec%20formatted.1.2.pdf[/DLMURL]
     
    Zuletzt von einem Moderator bearbeitet: 24.10.2015
  5. Winn

    Winn MacUser Mitglied

    Beiträge:
    423
    Zustimmungen:
    0
    MacUser seit:
    07.11.2002
    &nbsp;
    Heißt das, daß man nicht mal eine Altivec Syntax nutzen muß, um Altivec zu nutzen... das wäre ja sensationell :)

    Winn
     
  6. -Nuke-

    -Nuke- Thread Starter MacUser Mitglied

    Beiträge:
    2.135
    Zustimmungen:
    15
    MacUser seit:
    13.09.2003
    Na das ist bei guten Compilern sowieso der Fall. Mal als (schlechtes) Beispiel:

    Du willst z.B. das hier Rechnen:

    sin(pi*cos(1425,421254574))*14,14541

    Wenn möglich dann legt der Compiler das sowieso in die Altivec-Einheit, damit es schneller geht.
     
  7. mdev

    mdev MacUser Mitglied

    Beiträge:
    24
    Zustimmungen:
    0
    MacUser seit:
    22.08.2002
    &nbsp;

    Nein, das heisst es leider nicht. Ich haette "Spracherweiterungen" anstelle von "Erweitungen" schreiben sollen, dann waere wohl klarer herausgekommen, dasz der Compiler dem Programmierer leider nicht den gefallen tut, automatisch diese zusaetzliche Recheneinheit zu Nutzen, nur weil die "Erweiterung" eingeschaltet ist. Inwieweit die Motorola-Erweiterungen tatsaechlich automatisch Code, der nicht entsprechend Vorbereitet ist an Altivec anpassen koennen weisz ich nicht.

    Um es mal ganz knapp zusammenzufassen:

    Altivec ist eine zusaetzliche Recheneinheit, die, wenn sie denn genutzt wird, tatsaechlich gewaltige Geschwindigkeitsvorteile hat. Man koennte sagen, dasz Altivec die Verarbeitung von gleichartigen Daten durch parallelisierung Beschleunigen kann.

    Ueblicherweise verarbeiten Programme Daten sequentiel, sprich: Ein Wert wird nach dem anderen Verarbeitet. Wenn ich also die Aufgabe habe, 16 Werte durch jeweils 16 andere Werte zu teilen, dann wuerde ein "normales" Programm folgendes tun:

    Solange (nicht alle 16 Werte verarbeitet) {
    Einen Wert nehmen
    Durch den jeweils korresponierenden anderen Wert teilen
    }

    Bei Benutzung von Altivec saehe das folgendermassen aus:

    1. Alle 16 Werte auf einen Rutsch in der Altivec Einheit speichern
    2. Die anderen 16 Werte in der Altivec Einheit Speichern
    3. Befehl an Altivec: Werte durch einander Teilen

    Das kann natuerlich extrem Fix sein, immerhin koennte ich das Ergebnis unter Benutzung von Altivec in nur 3 Schritten erreichen, anstatt mit (mindestens) 32 ohne Altivec.

    Allerdings ist es eben in den weitaus meisten Faellen nicht so Simpel wie oben geschildert. Und wenn man Altivec "falsch" Nutzt, wird die Applikation langsamer als ganz ohne Benutzung von Altivec. Im schlimmsten Fall kommt beim Rechnen einfach nur Muell heraus.

    Falls Interesse besteht, bin ich sehr gerne bereit den "Mythos Altivec" mal naeher zu Beschreiben, anstatt wie ueblich auf die Dokumentation fuer Programmierer zu Verweisen (die fuer Einsteiger eine ziemlich harte Nuss sein kann).
     
  8. Winn

    Winn MacUser Mitglied

    Beiträge:
    423
    Zustimmungen:
    0
    MacUser seit:
    07.11.2002
    Das hört sich ausgesprochen interessant an... denn ich benutze meinen G4 in meiner Diplomarbeit für rechnergestützte Simulationen... habe also reichlich Daten zu berechnen. Innerhalb des Hauptteils der der Rechenintensivste ist, habe ich mehrere Summationen und Multiplikationen durchzuführen... da würde sich die Altivec ja hervorragend einbringen... könnte sie auch for Schleifen beschleunigen ?

    Bin ganz Ohr :p

    Winn
     
  9. -Nuke-

    -Nuke- Thread Starter MacUser Mitglied

    Beiträge:
    2.135
    Zustimmungen:
    15
    MacUser seit:
    13.09.2003
    Hast du CHUD-Tools drauf?

    Da gibt´s in den Einwicklerbeispielen ein nettes Beispiel. Nämlich den Bildschirmschöner Flurry im Quellcode. Außerdem gibt´s noch Schalter für "normal-Berechnung" und dann noch "Altivec". Das ist cool. Man kann zig Flurrys hinzufügen. D.h. man packt mal eben 20 Flurrys rein. Mit Scalar-Berechnung langsam. Mit Altivec butterweich. :)

    Dort sieht man schön den Geschwindigkeitsunterscheid und dank Quellcode auch das "wie".
     
    Zuletzt bearbeitet: 28.02.2004
  10. -Nuke-

    -Nuke- Thread Starter MacUser Mitglied

    Beiträge:
    2.135
    Zustimmungen:
    15
    MacUser seit:
    13.09.2003
    Hi.

    Jetzt geht´s soweit. Zumindest führt er jetzt die Befehle wie vec_add aus. Es lag bei mir an der Eingabe.

    Nur habe ich eine wichtige Frage. Wie konventiere ich diese Werte, damit ich diese an STL-Befehle wie cout usw. übergeben kann?

    Also wie mache ich aus einem vector float einen float und der gleichen? Oder muss man da generell anders heran gehen?

    Danke.
     
Die Seite wird geladen...