Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Rund um die Programmierung ::  OpenCL     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
ReduX
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.06.2007
Beiträge: 194
Beitrag ReduX Mitglied 05:16:33 02.01.2010   Titel:   OpenCL            Zitieren

Morgen,
Habe ich das Richtig verstanden, dass man mit OpenCL Berrechnungen auf so ziemlich allen Grafikkarten anstellen kann, also die GPU für Rechenoperationen nutzen?

Wenn ja, was haltet ihr davon? Habt ihr schon bessere Libs benutzt? Möchte mich eventuell in diese Lib einarbeiten, da ja auf Mathematischer Ebene immer mehr mit GPU's gearbeitet wird.

MFG ReduX
macuser__
Unregistrierter




Beitrag macuser__ Unregistrierter 23:48:43 02.01.2010   Titel:              Zitieren

auf http://www.macresearch.org/opencl gibt es ein Videotutorial zu opencl. Ich würde dir einfach mal empfehlen dir die erste Episode anzusehen, auch wenn du keinen mac nutzt. Geht dabei eigentlich kaum um den Mac, außer das opencl darauf läuft. (Also in der 1. Episode)
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 01:28:20 03.01.2010   Titel:              Zitieren

opencl ist keine sprache um GPUs zu programmieren, sondern eine um compute programme zu schreiben die hardware unabhaengig sind. opencl programme kannst du auf verschiedenen platformen laufen lassen. das mandelmaenchen was ich portiert habe skaliert in etwa

x86 - 100%
cell - 10x (1000%)
gtx260 - 100x

um es auf x86 laufen zu lassen kannst du das streamsdk von amd ausprobieren
fuer cell gibt es bei ibm libs
fuer geforce kannst du dir das nv-sdk ziehen

alle haben opencl samples dabei.

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
DarkShadow44
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.06.2009
Beiträge: 517
Beitrag DarkShadow44 Mitglied 17:59:16 06.01.2010   Titel:              Zitieren

Müsste letztendlich egal sein, mit welchem SDK du kompilierst, da OpenCL plattformunabhängig ist.

Bei Nvidia gibt's übrigens ab GeForce 8 auch CUDA, mit dem man auch Berechnungen auf der GPU durchführen kann. ;)

Aber das wird vermutlich nur auch Grafikkarten von Nvidia funktionieren...
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 14:10:20 17.06.2012   Titel:   OpenCl und Microsoft C++ Visual Studio 2010 Express            Zitieren

Habe schon in der Uni gelernt, wie man auf Kerne parallelisiert. Z.B. beim Berechnen der Zahl Pi, bei der man auch kritische Bereiche beachten muß.

Aktuell versuche ich den Übergang vom Hobbyprogrammierer zum professionellen Programmierer zu schaffen. Bei mir ist Microsoft C++ Visual Studio 2010 Express bereits installiert und ich habe ein Projekt, das ich darin parallelisieren möchte.

Was muß man nachinstallieren und wie, um OpenCl darunter nutzen zu können?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 14:35:00 17.06.2012   Titel:              Zitieren

Du brachst das entsprechende SDK deines Grafikkartenherstellers...

_________________
one point of view will never reveal the entire scene.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 14:55:47 17.06.2012   Titel:              Zitieren

Danke, probiere ich aus.

1. Ist es richtig, daß sowohl GPUs und CPUs, je nach vorliegender Technik, genutzt werden?

2. Was ist, wenn ich jetzt SDK runterlade? Also ich habe eine NVIDIA GEFORCE* GT 540M CUDA TM . 2GB in meinem Profiprogrammiernotebook. Würde das fertige Programm bei anderen Grafikkarten wenigstens noch die CPU-Kerne alle berücksichtigen?

3. Kann man durch Herunterladen einiger weiterer SDKs das eigene Programm so ausstatten, daß es entsprechend vielseitiger funktioniert?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 17:39:09 17.06.2012   Titel:              Zitieren

Vernunftmensch schrieb:
1. Ist es richtig, daß sowohl GPUs und CPUs, je nach vorliegender Technik, genutzt werden?

Du kannst beide nutzen, aber das musst du selber machen, implementieren und vor allem eine kluge Möglichkeit finden, wie man die Arbeit am besten auf diese verteilt.

Vernunftmensch schrieb:
2. Was ist, wenn ich jetzt SDK runterlade? Also ich habe eine NVIDIA GEFORCE* GT 540M CUDA TM . 2GB in meinem Profiprogrammiernotebook. Würde das fertige Programm bei anderen Grafikkarten wenigstens noch die CPU-Kerne alle berücksichtigen?

Musst du dafür sorgen. OpenCL ist Herstellerunabhängig, wenn du es richtig umsetzt, wird es auch eine AMD Graphikkarte mitverwenden, falls eine oder mehrere vorhanden sind.

Vernunftmensch schrieb:
3. Kann man durch Herunterladen einiger weiterer SDKs das eigene Programm so ausstatten, daß es entsprechend vielseitiger funktioniert?

Nein, du benötigst nur die entsprechenden Treiber auf dem Zielcomputer. OpenCL hat das ICD (Installable Client Driver) Konzept:
http://www.khronos.org/re ....... nsions/khr/cl_khr_icd.txt

Die Graphikkarten installieren ihre OpenCL Treiber heutzutage automatisch und registrieren sie korrekt. Daher musst du da nichts machen, nur die Plattform (oder mehrere) auswählen und die Devices ansprechen, bzw. ihnen was zum Arbeiten geben.

Bei den CPUs sieht das anders aus, da sind die OpenCL Treiber meistens nicht vorhanden auf dem Zielcomputer. Die Frage ist allerdings sowieso, ob es sich überhaupt lohnt die CPU miteinzubeziehen. Die GT 540M kann, glaub ich, 96 Threads physisch parallel verarbeiten. Ein Intel i7 mit HyperThreading dagegen maximal nur 8. Eine gute Desktopgraphikkarte kann sogar bis zu 512 und mehr Threads physisch parallel verarbeiten.


Und warum buddelst du so alte Threads raus, statt einen neuen zu eröffnen?

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 21:43:42 17.06.2012   Titel:              Zitieren

Dravere schrieb:
Eine gute Desktopgraphikkarte kann sogar bis zu 512 und mehr Threads physisch parallel verarbeiten.

Seit die GTX 680 heraußen ist, stehen wir bei 1536 Threads ;)

_________________
one point of view will never reveal the entire scene.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 00:16:21 18.06.2012   Titel:              Zitieren

dot schrieb:
Dravere schrieb:
Eine gute Desktopgraphikkarte kann sogar bis zu 512 und mehr Threads physisch parallel verarbeiten.

Seit die GTX 680 heraußen ist, stehen wir bei 1536 Threads ;)

Und ich musste für meine Arbeit noch zwei GTX 560 Ti mit je 384 Cores verwenden - schweinerei. Ich will zwei GTX 680! :D
Der Aktuelle Code ist 50x schneller als auf der CPU (i7 2600), ich frage mich, wie schnell er mit zwei GTX 680 wäre :leak:

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 00:23:06 18.06.2012   Titel:              Zitieren

Dravere schrieb:
Ich will zwei GTX 680! :D

Falsch, du willst eine 690 (zwei 680 auf einer Karte -> 3072 CUDA Cores) :p

Abgesehen davon, hat die 680 leider einige Issues, die sie für Compute Anwendungen unter Umständen nicht ganz so attraktiv machen. Aber die demnächst kommenden Kepler Karten, werden da gewaltig Abhilfe schaffen ;)

_________________
one point of view will never reveal the entire scene.


Zuletzt bearbeitet von dot am 00:24:43 18.06.2012, insgesamt 3-mal bearbeitet
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 01:08:57 18.06.2012   Titel:              Zitieren

dot schrieb:
Dravere schrieb:
Ich will zwei GTX 680! :D

Falsch, du willst eine 690 (zwei 680 auf einer Karte -> 3072 CUDA Cores) :p

Oder zwei GTX 690 :D
2x 1150 CHF = 2300 CHF ~ 1916 €
Kein Problem, zahlt ja der Steuerzahler ;)

Und die Dinger haben noch 4 GB Videospeicher. Danke für den Hinweis, werde ich in meine kommende Präsentation einbauen.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 01:15:17 18.06.2012   Titel:              Zitieren

Schone den Steuerzahler noch bis die GK110 Chips kommen, dann zahlt sich's wirklich aus. Die Dinger sind erst richtig awesome. Die 690 ist dagegen nur ein Appetithäppchen ;)

_________________
one point of view will never reveal the entire scene.


Zuletzt bearbeitet von dot am 01:22:56 18.06.2012, insgesamt 3-mal bearbeitet
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 19:09:07 18.06.2012   Titel:              Zitieren

SDK installiert.

1. Wo finde ich einigen Beispielcode für OpenCl?

2. Gibt es ein Tool, welches mir anzeigt, wieviele GPUs aktuell aktiv sind?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.


Zuletzt bearbeitet von Vernunftmensch am 19:10:15 18.06.2012, insgesamt 1-mal bearbeitet
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 20:00:08 18.06.2012   Titel:              Zitieren

Vernunftmensch schrieb:
1. Wo finde ich einigen Beispielcode für OpenCl?

Vermutlich in dem SDK, oder sonst im Internet...

Vernunftmensch schrieb:
2. Gibt es ein Tool, welches mir anzeigt, wieviele GPUs aktuell aktiv sind?

Was genau meinst du damit?

_________________
one point of view will never reveal the entire scene.
Zeus
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.09.2003
Beiträge: 2847
Beitrag Zeus Mitglied 20:12:42 18.06.2012   Titel:              Zitieren

*hust* 2013 soll doch schon Maxwell kommen, die sollen laut Nvidia acht mal effizienter werden.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 20:21:50 18.06.2012   Titel:              Zitieren

Quellcode gefunden.

Beim Compelieren der Projektmappe gibt es bei jedem Projekt Probleme mit der Konvertierung. Ich benutze Microsoft Visual C++ 2010 Express.

1. Woran liegt das?

2. Gibt es ein Tool, das die Auslastung aller GPUs anzeigen kann?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Zeus
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.09.2003
Beiträge: 2847
Beitrag Zeus Mitglied 20:24:01 18.06.2012   Titel:              Zitieren

http://superuser.com/ques ....... tor-gpu-load-on-windows-7
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 20:30:57 18.06.2012   Titel:              Zitieren

Danke.

1. Warum habe ich Schwierigkeiten, den OpenCl-Quellcode in Microsoft Visual Studio c++ 2010 Express zu konvertieren? (Immerhin heißt die Projektmappe Microsoft Visual Studio Solution (.sln) )

2. Ich habe hauptsächlich Skalarprodukte und andere Vektoroperationen vor. Habt ihr ganz einfache Beispiele?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.


Zuletzt bearbeitet von Vernunftmensch am 20:32:22 18.06.2012, insgesamt 2-mal bearbeitet
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 20:33:21 18.06.2012   Titel:              Zitieren

Vernunftmensch schrieb:
1. Warum habe ich Schwierigkeiten, den OpenCl-Quellcode in Microsoft Visual Studio c++ 2010 Express zu konvertieren? (Immerhin heißt die Projektmappe Microsoft Visual Studio Solution (.sln) )

Wenn du darauf wirklich eine Antwort haben willst, dann solltest du uns vielleicht zumindest mal verraten, was genau für "Schwierigkeiten" du eigentlich hast...

Vernunftmensch schrieb:
2. Ich habe hauptsächlich Skalarprodukte und andere Vektoroperationen vor. Habt ihr einfache Beispiele?

"Skalarprodukte und andere Vektoroperationen" ist ein wenig zu allgemein, als dass man da jetzt irgendwas konkretes drauf sagen könnte...

_________________
one point of view will never reveal the entire scene.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 20:46:03 18.06.2012   Titel:              Zitieren

zu 1: http://www.occultusactus. ....... Konvertierungsproblem.jpg

zu 2:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Cut off sphere.
void euclidianpointcloud::unmarksphere (cadcam::mwTPoint3d<double> msphere, double r)
{
    int x,y,z; //Arraypoint.
    cadcam::mwTPoint3d<double> realpoint;//Real point.
 
    //What to calculate?
    cadcam::mwTPoint3d<double> c;
    cadcam::mwTPoint3d<double> m_gew;//Rel. point cloud vector;
    cadcam::mwTPoint3d<double> m_gew2;//Rel. point cloud vector;
    m_gew=msphere-ref;
    m_gew=m_gew/grid_delta;
    double r_gew=r/grid_delta;
    m_gew2=m_gew+r_gew*einsvektor+einsvektor;
    if (m_gew2.x()>nx) m_gew2.x(nx);
    if (m_gew2.y()>ny) m_gew2.y(ny);
    if (m_gew2.z()>nz) m_gew2.z(nz);
   
    x=(int) (m_gew.x()-r_gew-1);
    if (x<0)
    x=0;
    while (x<m_gew2.x())
    {
        y=(int) (m_gew.y()-r_gew-1);
        if (y<0)
        y=0;
        while (y<m_gew2.y())
        {
            z=(int) (m_gew.z()-r_gew-1);
            if (z<0)
            z=0;
            while (z<m_gew2.z())
            {
                //Calculate actuall rel. cloude-vector.
                c.x(x);c.y(y);c.z(z);
 
                //All points are c to check.
                realpoint=ref+c*grid_delta;
                if (~(realpoint-msphere)<=r)
                mark (realpoint);
 
                z++;
            };
            y++;
        };
        x++;
    };
};

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 17:01:56 20.06.2012   Titel:              Zitieren

dot schrieb:
Dravere schrieb:
Eine gute Desktopgraphikkarte kann sogar bis zu 512 und mehr Threads physisch parallel verarbeiten.

Seit die GTX 680 heraußen ist, stehen wir bei 1536 Threads ;)

halbes jahr vorher waren es noch 2048 als die 7970 rauskam.

wobei die GPUs mehr 'threads' verarbeiten als das, das sind nur die ausfuehrungseinheiten fuer arithmetische berechnungen, die thread zahl die active ist, ist glaube ich 8192 bei GK104

dot schrieb:

Abgesehen davon, hat die 680 leider einige Issues, die sie für Compute Anwendungen unter Umständen nicht ganz so attraktiv machen. Aber die demnächst kommenden Kepler Karten, werden da gewaltig Abhilfe schaffen
welche issues? meinst nicht die schlechten luxmark werte wegen fehlender treiber optimierung? was gab es denn da noch was mit neuer hardware gefixt wird?

Zeus schrieb:
*hust* 2013 soll doch schon Maxwell kommen, die sollen laut Nvidia acht mal effizienter werden.

das war aber gegenueber fermi, oder? wuerde in die reihe passen, kepler ist laut NVidia paper ca 2x-3x effizienter

Zitat:
2. Gibt es ein Tool, das die Auslastung aller GPUs anzeigen kann?

es gibt z.B. NSight von nvidia, das kann dir sehr genau sagen zu welchem anteil du welche einheiten deiner GPU ausnutzt, zudem werden dir die limitierenden stellen angezeigt und es gibt sogar tipps, wie du noch effizienter die GPU auslasten koenntest.

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
Zeus
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.09.2003
Beiträge: 2847
Beitrag Zeus Mitglied 18:02:51 20.06.2012   Titel:              Zitieren

rapso schrieb:

Zeus schrieb:
*hust* 2013 soll doch schon Maxwell kommen, die sollen laut Nvidia acht mal effizienter werden.

das war aber gegenueber fermi, oder? wuerde in die reihe passen, kepler ist laut NVidia paper ca 2x-3x effizienter

Mein Fehler in der Tat gegenüber Fermi.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 18:16:33 20.06.2012   Titel:              Zitieren

Hat jemand hier schon ein größeres Projekt in OpenCl fertiggemacht?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 19:05:50 20.06.2012   Titel:              Zitieren

Vernunftmensch schrieb:
Hat jemand hier schon ein größeres Projekt in OpenCl fertiggemacht?

Kommt darauf an, was du als grösseres Projekt bezeichnest. Ein wesentlicher Teil meiner Bachelorarbeit war/ist OpenCL. Ob ich bestehe, kommt allerdings erst noch raus *an den Fingernägeln kaut* :D

Die Arbeit ist zwar fertig, aber das Projekt wohl noch länger nicht. Gibt noch viel zu tun und aktuell bremsen auch die OpenCL Treiber von Nvidia. Zumindest scheint es an denen zu liegen. Die GTX 560 Ti will einfach keinerlei Befehle parallel ausführen, heisst z.B. parallel Daten hoch-,runterladen und Kernel ausführen. Habe auch von anderen Entwicklern mit dem gleichem Problem gehört. Wird wohl einfach von den Nvidia Treibern (unter Linux) nicht unterstützt. Bewusst oder unbewusst... Eine Stellungsnahme von Nvidia dazu gibt es jedenfalls nicht, bzw. ich konnte bisher dazu nichts finden.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
So siehts aus
Unregistrierter




Beitrag So siehts aus Unregistrierter 10:53:59 21.06.2012   Titel:              Zitieren

Kann man OpenCL und OpenGL eigentlich gleichzeitig benutzen?

Also die GPU sowohl für Computing Sachen als auch für die 3d Darstellung zur selben Zeit nutzen oder braucht man dafür zwei GPUs?


Und falls das gleichzeitig geht, kann man die Arbeit manuell aufteilen?
Wenn eine GPU z.B. 100 Threads schafft, kann ich dann sagen, 60 Threads für die Grafik und 40 für das Computing?
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 10:59:08 21.06.2012   Titel:              Zitieren

So siehts aus schrieb:
Kann man OpenCL und OpenGL eigentlich gleichzeitig benutzen?

Ja, also gemeinsam im selben Programm. OpenGL und OpenCL können miteinander kommunizieren.

So siehts aus schrieb:
Wenn eine GPU z.B. 100 Threads schafft, kann ich dann sagen, 60 Threads für die Grafik und 40 für das Computing?

Nein, zumindest nicht im Moment.

_________________
one point of view will never reveal the entire scene.


Zuletzt bearbeitet von dot am 11:00:38 21.06.2012, insgesamt 2-mal bearbeitet
So siehts aus
Unregistrierter




Beitrag So siehts aus Unregistrierter 11:21:32 21.06.2012   Titel:              Zitieren

dot schrieb:
So siehts aus schrieb:
Kann man OpenCL und OpenGL eigentlich gleichzeitig benutzen?

Ja, also gemeinsam im selben Programm. OpenGL und OpenCL können miteinander kommunizieren.

So siehts aus schrieb:
Wenn eine GPU z.B. 100 Threads schafft, kann ich dann sagen, 60 Threads für die Grafik und 40 für das Computing?

Nein, zumindest nicht im Moment.


Hm, okay und wie wird das dann aufgeteilt?
Macht das die GPU automatisch?

Kann ich wenigstens Prioritäten setzten?
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 11:26:32 21.06.2012   Titel:              Zitieren

So siehts aus schrieb:
dot schrieb:
So siehts aus schrieb:
Kann man OpenCL und OpenGL eigentlich gleichzeitig benutzen?

Ja, also gemeinsam im selben Programm. OpenGL und OpenCL können miteinander kommunizieren.

So siehts aus schrieb:
Wenn eine GPU z.B. 100 Threads schafft, kann ich dann sagen, 60 Threads für die Grafik und 40 für das Computing?

Nein, zumindest nicht im Moment.


Hm, okay und wie wird das dann aufgeteilt?
die werden in der reihenfolge abgearbeitet in der du die kommandos schickst.
Zitat:

Macht das die GPU automatisch?
ja, die arbeitet job fuer job ab, sobald genug resourcen fuer einen neuen job vorhanden sind, wird dieser ausgefuehrt.
Zitat:

Kann ich wenigstens Prioritäten setzten?
nur indem du die wichtigen sachen zuerst schickst und mit niedriger prioritaet spaeter.

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 11:28:44 21.06.2012   Titel:              Zitieren

Wobei sich da mit der nächsten GPU Generation was tun wird.

_________________
one point of view will never reveal the entire scene.
So siehts aus
Unregistrierter




Beitrag So siehts aus Unregistrierter 12:10:16 21.06.2012   Titel:              Zitieren

dot schrieb:
Wobei sich da mit der nächsten GPU Generation was tun wird.


Hört sich interessant an, hast du mehr Infos dazu?


@rapso
Wirkt sich das nicht in Ruckler aus, wenn z.B: die Grafik im Zeitschlitzverfahren berechnet wird, und das Comuting für z.B. die Physik immer dazwischen berechnet wird?
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 12:15:41 21.06.2012   Titel:              Zitieren

So siehts aus schrieb:
dot schrieb:
Wobei sich da mit der nächsten GPU Generation was tun wird.


Hört sich interessant an, hast du mehr Infos dazu?

Schau dir einfach die Talks der GTC 2012 an, das konkrete Stichwort lautet Hyper-Q. ;)

_________________
one point of view will never reveal the entire scene.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 13:21:24 21.06.2012   Titel:              Zitieren

So siehts aus schrieb:

Wirkt sich das nicht in Ruckler aus, wenn z.B: die Grafik im Zeitschlitzverfahren berechnet wird, und das Comuting für z.B. die Physik immer dazwischen berechnet wird?
nein, denn du berechnest beides pro frame, ob du jetzt 50% der zeit physics rechnest und dann 50% renderst oder 100% der zeit zu je 50% beides machst, ist jacke wie hose (wobei es eigentlich besser sein sollte einen job voll auszufuehren, da dann mehr cache lokalitaet vorhanden sein sollte).
falls du physics hast die mehr als ein frame braucht, hast du eh probleme, weil du irgendwas rendern musst was noch nicht bereitsteht. das naechste problem waere, wenn ein job mehr als 2sekunden braucht, wird windows den treiber neustarten (kann man in der registry aendern, aber das haben die aller wenigsten).

wenn du richtig boese compute machst (und ich meine nur compute, ohne rendering), wird dein windows mauszeiger ruckeln, weil windows auch nicht mehr dazu kommt aero zu rendern. dann machst du alles richtig :cool:

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
Beitrag dot Mitglied 13:24:18 21.06.2012   Titel:              Zitieren

Richtig machst du's wenn du den Watchdog Timer für den Grafiktreiber ausschalten musst :p

_________________
one point of view will never reveal the entire scene.


Zuletzt bearbeitet von dot am 13:24:29 21.06.2012, insgesamt 1-mal bearbeitet
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 23:48:51 06.07.2012   Titel:   Anfänger in OpenCl            Zitieren

Heute endlich wieder zum Programmieren gekommen. Seit fast einer Stunde möchte ich ein einfaches OpenCl-Beispiel ans Laufen bringen. Habe mir dazu schon NVIDEA SDK 11 runtergeladen und installiert.

Kann jemand mir bitte den Link zu einem einfachen C++-Beispiel schicken, damit ich dieses einfache Beispiel versuchen kann, zu installieren?

Edit: Zu compelieren meine ich selbstverständlich.

Edit: Ich bräuchte nach erster Einschätzung die Headers und die Libs.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.


Zuletzt bearbeitet von Vernunftmensch am 00:12:46 07.07.2012, insgesamt 2-mal bearbeitet
raps
Unregistrierter




Beitrag raps Unregistrierter 01:12:08 07.07.2012   Titel:              Zitieren

nvidia's sdk hat eigentlich viele beispiele, einfaches ist z.b. der bandwidth test.

kannst dir auch das intel oder ati sdk installieren (ocl ist nicht abhaengig von deiner GPU).
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 04:04:35 07.07.2012   Titel:              Zitieren

Also ein Beispiel habe ich jetzt.

Die richtigen Dateien im richtigen Verzeichnis CL/ auch.

Jetzt wird die OpenCl.lib nicht gefunden. Ich verzweifel. Ich finde auch kein OpenCl for dummies oder sowas.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Andreas XXL
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2004
Beiträge: 1011
Beitrag Andreas XXL Mitglied 14:25:57 07.07.2012   Titel:              Zitieren

rapso schrieb:


falls du physics hast die mehr als ein frame braucht, hast du eh probleme, weil du irgendwas rendern musst was noch nicht bereitsteht. das naechste problem waere, wenn ein job mehr als 2sekunden braucht, wird windows den treiber neustarten (kann man in der registry aendern, aber das haben die aller wenigsten).


Kannst Du bitte erläutern, wie man diese Zeitbeschränkung in der Registry abschaltet?
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 21:13:39 08.07.2012   Titel:              Zitieren

erster treffer wenn man z.b. nach "windows driver restart 2 second" googlet

http://msdn.microsoft.com ....... ws/hardware/gg487368.aspx

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 16:36:28 10.07.2012   Titel:   OpenCL unter Ubuntu 12.04 LTS            Zitieren

vernunftmensch@ubuntu:~/NVIDIA_GPU_Computing_SDK/OpenCL$ echo $PATH

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/cuda/bin:/usr/local/cuda/lib

vernunftmensch@ubuntu:~/NVIDIA_GPU_Computing_SDK/OpenCL$ echo $LD_LIBRARY_PATH

:/usr/local/cuda/lib64:/usr/local/cuda/lib

vernunftmensch@ubuntu:~/NVIDIA_GPU_Computing_SDK/OpenCL$ make

make[1]: Betrete Verzeichnis '/home/vernunftmensch/NVIDIA_GPU_Computing_SDK/OpenCL/common'

a - obj/release/oclUtils.cpp.o

make[1]: Verlasse Verzeichnis '/home/vernunftmensch/NVIDIA_GPU_Computing_SDK/OpenCL/common'

make[1]: Betrete Verzeichnis '/home/vernunftmensch/NVIDIA_GPU_Computing_SDK/shared'

make[1]: Verlasse Verzeichnis '/home/vernunftmensch/NVIDIA_GPU_Computing_SDK/shared'

make[1]: Betrete Verzeichnis '/home/vernunftmensch/NVIDIA_GPU_Computing_SDK/OpenCL/src/oclSortingNetworks'

/usr/bin/ld: cannot find -lOpenCL

collect2: ld gab 1 als Ende-Status zurück

make[1]: *** [../../..//OpenCL//bin//linux/release/oclSortingNetworks] Fehler 1

make[1]: Verlasse Verzeichnis '/home/vernunftmensch/NVIDIA_GPU_Computing_SDK/OpenCL/src/oclSortingNetworks'

make: *** [src/oclSortingNetworks/Makefile.ph_build] Fehler 2

vernunftmensch@ubuntu:~/NVIDIA_GPU_Computing_SDK/OpenCL$

Bei mir läuft jetzt der neuste Treiber NVIDEA GEFORCE GT 540M CUDA 2GB. Nach der Installation der Treiber habe ich erst das Toolkit CODA, dann das GPUPROGRAMMING-Zeugs von http://developer.nvidia.com/cuda-downloads heruntergeladen unb beides ordentlich installiert. Danach habe ich PATH und LD_LIBRARY_PATH ~/.bashrc angepaßt.

Warum meckert ld?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Christoph
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 5945
Beitrag Christoph Moderator 20:02:13 10.07.2012   Titel:   Re: OpenCL unter Ubuntu 12.04 LTS            Zitieren

Vernunftmensch schrieb:
Warum meckert ld?

Deswegen:
Vernunftmensch schrieb:
/usr/bin/ld: cannot find -lOpenCL

Offenbar gibt es keine Datei namens libOpenCL.irgendwas im Library-Suchpfad.

_________________
Wenn Word für Längeres geeignet wäre, würde es nicht Word, sondern Sentence, Page oder Article heißen.
nman
Moderator

Benutzerprofil
Anmeldungsdatum: 19.02.2002
Beiträge: 13912
Beitrag nman Moderator 20:34:53 10.07.2012   Titel:              Zitieren

Warum fragst du nicht Google? Zweiter Treffer.

http://ubuntuforums.org/showthread.php?t=1877568

_________________
…but tuesday's just as bad.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 10:33:03 11.07.2012   Titel:              Zitieren

Problem durch richtiges Setzen der Umgebungsvariablen gelöst.

Neues Problem: ../../..//shared//inc/GL/glxew.h:62:22: schwerwiegender Fehler: X11/Xlib.h: Datei oder Verzeichnis nicht gefunden

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
nman
Moderator

Benutzerprofil
Anmeldungsdatum: 19.02.2002
Beiträge: 13912
Beitrag nman Moderator 11:57:10 11.07.2012   Titel:              Zitieren

Auch danach kanns du googeln. Tip: Mehr Treffer gibt's, wenn du die Sprache der Ausgaben auf Englisch stellst.

_________________
…but tuesday's just as bad.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 12:23:17 11.07.2012   Titel:              Zitieren

Code:
1
2
3
4
5
6
7
8
9
10
11
vernunftmensch@ubuntu:~/NVIDIA_GPU_Computing_SDK/OpenCL/bin/linux/release$ sudo optirun ./oclDotProduct
 
[oclDotProduct] starting...
 
Error -1001 in clGetPlatformIDs Call !!!
 
!!! Error # -1000 (Unspecified Error) at line 81 , in file oclDotProduct.cpp !!!
 
Exiting...
 
vernunftmensch@ubuntu:~/NVIDIA_GPU_Computing_SDK/OpenCL/bin/linux/release$


Mitlerweile weiß ich, daß damit gemeint sein könnte, daß keine GPUs gefunden werden. :-(

Was nu?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 13:01:49 11.07.2012   Titel:              Zitieren

Vernunftmensch schrieb:

Mitlerweile weiß ich, daß damit gemeint sein könnte, daß keine GPUs gefunden werden. :-(

frage vorweg, google hat nichts ergeben? ich haette gedacht, dass du da nicht der einzige mit diesem fehler bist.

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 00:05:44 12.07.2012   Titel:              Zitieren

Im Netz finde ich garnichts. Das ist ja das Problem.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 10:12:23 12.07.2012   Titel:              Zitieren

versuch es mit
linux Error "-1001" in clGetPlatformIDs
das sieht nach einer ganzen menge aus, klingt als ob es ein generischer error waere der viele gruende haben koennte.

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 00:26:01 13.07.2012   Titel:              Zitieren

Ich weiß nicht mehr weiter. Google kriege ich auch nichts raus.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 11:44:04 15.07.2012   Titel:              Zitieren

Jetzt habe ich es unter Windows geschafft. OpenCl läuft.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 13:34:57 15.07.2012   Titel:   Normale kleine Funktionen innerhalb OpenCl            Zitieren

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 void Dummy()
 {
    int i=0;
    while (i<1000)
    {
    i++;
    };
 }
 
 // OpenCL Kernel Function for element by element vector addition
__kernel void VectorAdd(__global const float* a, __global const float* b, __global float* c, int iNumElements)
{
    // get index into global data array
    int iGID = get_global_id(0);
 
    // bound check (equivalent to the limit on a 'for' loop for standard/serial C code
    if (iGID >= iNumElements)
    {  
        return;
    }
   
    dummy ();
 
    // add the vector elements
    c[iGID] = a[iGID] + b[iGID];
}


Das klappt nicht. Wie muß man das abändern?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 13:45:18 15.07.2012   Titel:              Zitieren

Sorry, klappt doch. Problem nur, daß dummy einmal klein und Dummy einmal groß geschrieben ist. :-)

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 14:35:53 15.07.2012   Titel:              Zitieren

clGetProgramBuildInfo - CL_PROGRAM_BUILD_LOG

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 11:28:25 17.07.2012   Titel:              Zitieren

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  // to mark a point
void mark (float3 p, float3 ref, int nx, int ny, int nz, float grid_delta, __global char* resultcloud)
{
    //Postpone in reference point.
    float3 c=p-ref;
    int xxx;
    int yyy;
    int zzz;
 
    //Strech according to grid_delta.
    c=c/grid_delta;
 
    xxx=(int) c.x;
    yyy=(int) c.y;
    zzz=(int) c.z;
 
    //Calculate position in array to be marked.
    if (xxx<nx)
    if (yyy<ny)
    if (zzz<nz)
    if (xxx>=0)
    if (yyy>=0)
    if (zzz>=0) ;;;
    //resultcloud [ (xxx+yyy*nx+zzz*nx*ny)]=1;
}


Wo könnte mein Fehler liegen? Ich möchte falsche Punkte rausfiltern, damit mein
OpenCl nicht abbricht. Obiger Code ist in der selben OpenCl *.cl Datei.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 7727
Beitrag rapso Moderator 12:23:34 17.07.2012   Titel:              Zitieren

Vernunftmensch schrieb:
[code]
Wo könnte mein Fehler liegen?
uns den fehler nicht zu nennen den du beheben moechtest ist der einzige den ich entdecken kann. ansonsten sieht es fehlerfrei aus ;).

_________________
Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986
-Mod im Spiele-/Grafikprogrammierung| rapsoo@hotmail.com | #dionysos irc.quakenet.org | amazon stole my PS3 :(
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 13:10:06 17.07.2012   Titel:              Zitieren

Die Prozedure umgehe ich jetzt.
Der Fehler bleibt.
Unter bestimmten Voraussetzungen (die ich noch nicht kenne) wird schon resultcloud[100]=1; nicht mehr von OpenCl akzeptiert.
Ich hoffe, daß nicht die Größe des Codeblocks bzw. die Größe der interngenutzten Variablen überschritten wird.

Gibt ja leider keine Fehlermeldung :-(

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 14:11:50 17.07.2012   Titel:              Zitieren

Was heisst "Fehler"? Was heisst "nicht mehr von OpenCL aktzeptiert"?

Vernunftmensch schrieb:
Gibt ja leider keine Fehlermeldung :-(

Doch, gibt es verschiedentlich. Jede Funktion gibt Fehlercodes zurück, welche man prüfen kann. Zudem gibt es, wie in meinem letzten Beitrag hier erwähnt, auch ein Buildlog.

Aber solange du uns nicht sagst, was deine Erwartungen vom Programm sind und was du stattdessen erhälst, bzw. was stattdessen passiert, uns somit beschreibst, was du als Fehler siehst, können wir dir unmöglich helfen.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 14:17:27 17.07.2012   Titel:              Zitieren

Folgender Code ist innerhalb der richtigen *.cl und läuft.

Nehme ich aber wesentlich größere Werte als 10*10*10 sehe ich kurz schwarz, der NVIDIA-Treiber lädt neu und dann FAILED beim Zurückschreiben den Ergebnisbuffers.



Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
min_gew.x=min_gew.y=min_gew.z=0;
    max_gew.x=10;   max_gew.y=10;   max_gew.z=10;
 
 
    x=(int)min_gew.x;
    while (x<max_gew.x)
    {
 
        y=(int)min_gew.y;
        while (y<max_gew.y)
        {
            z=(int)min_gew.z;
            while (z<max_gew.z)
            {
           
                //Calculate point
                c.x=(x);
                c.y=(y);
                c.z=(z);
                //std::cout << c;
 
 
 
 
                //Calculating
                realpoint=ref+c*grid_delta;
 
 
               
                t=(dotproduct(realpoint,pointc)-fest_oben)/fest_unten;
 
               
                quermittelpunkt=pointa+t*pointc;
 
           
                                           
       
                 if (t>=0)
                 if (t<=1)
                    if (vectorlength(realpoint-quermittelpunkt)<=r)
                      {
                       
                        resultcloud [x+y*nx+z*nx*ny]=1;
                       
                      };
                     
                 
                z++;
            };
            y++;
        };
       
        x++;
    };


Warum funktioniert hier 10*10*10, aber mehr nicht? Oder baue ich hier zu OpenCl unbemerkt ein Feld auf oder sowas?

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 14:23:15 17.07.2012   Titel:              Zitieren

Und wie rufst du den Kernel auf? Was übergibst du? Wie hast du die verschiedenen Grössen gesetzt? Kannst du es in einem KLEINEN Projekt reproduzieren? usw.

Sollen wir hellsehen? Da muss ich dich leider enttäuschen. Der GROSSADMINISTRATOR hat alle Glaskugeln konfisziert.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 14:27:28 17.07.2012   Titel:              Zitieren

Ich möchte meine CL-Datei posten. Wie kann man hier einen Dateianhang machen?

Na, gut. Erstmal hier direkt:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/*
                                                             ********************************************
                                                             OpenCl distributor by xxx
                                                             ********************************************
 */
 
 
 
 
 
 
 
 
// E
float3 einsvektor()
{
    float3 e;
    e.x=e.y=e.z=1;
    return e;
}
 
float vectorlength (float3 a)
{
    return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}
 
/*
// length
float operator~(float3 a)
{
    return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}
*/
 
// dot product
float dotproduct (float3 a, float3 b)
{
     return (a.x * b.x+ a.y * b.y+ a.z * b.z);
}
/*
float operator*(float3 a, float3 b)
{
    return (a.x * b.x+ a.y * b.y+ a.z * b.z);
}
*/
 
 
void _unmarklinearway (float3 pointa, float3 pointb,
                //float3 ref,
                int nx, int ny,
                int nz, float r,
                float grid_delta,
                __global char* resultcloud)
{
   
 
    // vector of move of sphere
    float3 pointc=pointb-pointa;
   
    float fest_oben=dotproduct(pointa,pointc);
    //Konstante
 
    float fest_unten=dotproduct(pointc,pointc);
    //Konstante
 
    float r_gew;
    float3 mz1_gew;
    float3 mz2_gew;
    float3 min_gew;
    float3 max_gew;
    float3 ref;
 
    int x,y,z; //Arraypoint.
    float3 c; //Point to calculate.
    float3 realpoint; //Real point.
    float3 quermittelpunkt; //Ref point.
 
    float t;
   
 
 
    // in case of no move betreen last discrete times
    if (vectorlength(pointc)==0)
        return;
 
    ref.x=ref.y=ref.z=0;
   
 
    //What to calculate?
    r_gew=r/grid_delta;
    mz1_gew=(pointa-ref)/grid_delta; //epicenter one
    mz2_gew=(pointb-ref)/grid_delta; //epicenter two
    min_gew=mz1_gew; //Really minimums?
    if (min_gew.x>mz2_gew.x) min_gew.x=(mz2_gew.x);
    if (min_gew.y>mz2_gew.y) min_gew.y=(mz2_gew.y);
    if (min_gew.z>mz2_gew.z) min_gew.z=(mz2_gew.z);//Now amen.
    max_gew=mz1_gew; //Really maximums?
    if (max_gew.x<mz2_gew.x) max_gew.x=(mz2_gew.x);
    if (max_gew.y<mz2_gew.y) max_gew.y=(mz2_gew.y);
    if (max_gew.z<mz2_gew.z) max_gew.z=(mz2_gew.z);//Now amen.
    max_gew+=einsvektor()+r_gew*einsvektor();
    min_gew-=einsvektor()+r_gew*einsvektor(); //To high or too deep?
    if (min_gew.x<0) min_gew.x=(0);
    if (min_gew.y<0) min_gew.y=(0);
    if (min_gew.z<0) min_gew.z=(0);
    if (max_gew.x>nx) max_gew.x=(nx);
    if (max_gew.y>ny) max_gew.y=(ny);
    if (max_gew.z>nz) max_gew.z=(nz);
 
       
 
    min_gew.x=min_gew.y=min_gew.z=0;
    max_gew.x=10;   max_gew.y=10;   max_gew.z=10;
 
 
    x=(int)min_gew.x;
    while (x<max_gew.x)
    {
 
        y=(int)min_gew.y;
        while (y<max_gew.y)
        {
            z=(int)min_gew.z;
            while (z<max_gew.z)
            {
           
                //Calculate point
                c.x=(x);
                c.y=(y);
                c.z=(z);
                //std::cout << c;
 
 
 
 
                //Calculating
                realpoint=ref+c*grid_delta;
 
 
               
                t=(dotproduct(realpoint,pointc)-fest_oben)/fest_unten;
 
               
                quermittelpunkt=pointa+t*pointc;
 
           
                                           
       
                 if (t>=0)
                 if (t<=1)
                    if (vectorlength(realpoint-quermittelpunkt)<=r)
                      {
                       
                        resultcloud [x+y*nx+z*nx*ny]=1;
                       
                      };
                     
                 
                z++;
            };
            y++;
        };
       
        x++;
    };
};
 
 
void _unmarksphere (float3 msphere,
                //float3 ref,
                int nx, int ny,
                int nz, float r,
                float grid_delta,
                __global char* resultcloud)
{
     float3 ref;
     ref.x=0;
     ref.y=0;
     ref.z=0;
    float r_gew;
    int x,y,z; //Arraypoint.
    float3 realpoint;//Real point.
 
    //What to calculate?
    float3 c;
    float3 m_gew;//Rel. point cloud vector;
    float3 m_gew2;//Rel. point cloud vector;
 
   
    m_gew=msphere-ref;
    m_gew=m_gew/grid_delta;
     r_gew=r/grid_delta;
 
     
    m_gew2=m_gew+r_gew*einsvektor()+einsvektor();
 
   
    if (m_gew2.x>nx) m_gew2.x=(nx);
    if (m_gew2.y>ny) m_gew2.y=(ny);
    if (m_gew2.z>nz) m_gew2.z=(nz);
   
   
    x=(int) (m_gew.x-r_gew-1);
    if (x<0)
    x=0;
    while (x<m_gew2.x)
    {
        y=(int) (m_gew.y-r_gew-1);
        if (y<0)
        y=0;
        while (y<m_gew2.y)
        {
           
            z=(int) (m_gew.z-r_gew-1);
            if (z<0)
            z=0;
            while (z<m_gew2.z)
            {
               
                //Calculate actuall rel. cloude-vector.
                c.x=(x);c.y=(y);c.z=(z);
               
                //All points are c to check.
                realpoint=ref+c*grid_delta;
 
               
                if (vectorlength(realpoint-msphere)<=r)
                resultcloud [x+y*nx+z*nx*ny]=1;
               
                z++;
            };
            y++;
           
        };
       
        x++;
    };
}
 
void _unmarkconnected (__global const float3* epicenters,
                //float3 ref,
                int nx, int ny,
                int nz, float r,
                float grid_delta,
                __global char* resultcloud , int igid)
{
 
    // unmark the actual sphere
    _unmarksphere (epicenters[igid], 1000, 500, 100, 5, 1, resultcloud);
 
 
    // is there an epicenter before the actual one?
    if (igid == 0)
    {
     return;
    };
 
    // unmark the actual linear way.
    _unmarklinearway (epicenters[igid-1], epicenters[igid], 1000, 500, 100, 5, 1, resultcloud);
 
};
 
 
 
  // OpenCL Kernel Function for element by element vector addition
__kernel void moveofsphere(__global const float3* epicenters, __global char* resultcloud, int iNumElements)
//__kernel void moveofsphereold (__global const float3* epicenters,__global char* resultcloud, int iNumElements, int nx, int ny, int nz, float sphereRad, float delta, float3 refPoint)        
{
    // get index into global data array
    int iGID = get_global_id(0);
 
    // bound check (Is there another epicenter?)
    if (iGID >= iNumElements)
    {
        return;
    };
 
    _unmarkconnected (epicenters, 1000, 500, 100, 5, 1, resultcloud, iGID);
}


Ich vermute stark, daß OpenCL versucht, die while-Schleifen selbst zu parallelisieren. Anders kann ich mir nicht erklären, daß es einen Unterschied macht, von wo bis wo gezählt wird. :-(

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.


Zuletzt bearbeitet von Vernunftmensch am 14:55:13 17.07.2012, insgesamt 2-mal bearbeitet
Vernunftmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2012
Beiträge: 25
Beitrag Vernunftmensch Mitglied 15:56:00 17.07.2012   Titel:              Zitieren

Nein, ich mußte nur einfach mehr Platz zum Arbeiten organisieren.

OpenCl liefert bei mir jetzt perfekte Ergebnisse.

_________________
Wer den C64er nicht ehrt, der ist des x64ers nicht wert.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8178
Beitrag Dravere Moderator 16:20:14 17.07.2012   Titel:              Zitieren

Vernunftmensch schrieb:
Nein, ich mußte nur einfach mehr Platz zum Arbeiten organisieren.

...

Du gehst die Sache nicht wirklich mit viel Vernunft an ...

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
c++.de :: Rund um die Programmierung ::  OpenCL   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.