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  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
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
c++.de :: Rund um die Programmierung ::  OpenCL  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7  Weiter
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.