OpenCL
-
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?
-
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.
-
Warum fragst du nicht Google? Zweiter Treffer.
-
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
-
Auch danach kanns du googeln. Tip: Mehr Treffer gibt's, wenn du die Sprache der Ausgaben auf Englisch stellst.
-
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?
-
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.
-
Im Netz finde ich garnichts. Das ist ja das Problem.
-
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.
-
Ich weiß nicht mehr weiter. Google kriege ich auch nichts raus.
-
Jetzt habe ich es unter Windows geschafft. OpenCl läuft.
-
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?
-
Sorry, klappt doch. Problem nur, daß dummy einmal klein und Dummy einmal groß geschrieben ist.
-
-
// 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.
-
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 ;).
-
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
-
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
-
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.
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?
-
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