2016-11-02 3 views
1

Ich habe den folgenden Code-Schnipsel Testen der VexCL Funktion umformen:VexCL Reshape Behaving Seltsamer

std::vector<int> ints; 
for (int i = 0; i < n; i++) ints.push_back(i); 
vex::vector<int> vex_ints(ctx, ints); 
vex_ints = vex::reshape(vex_ints, vex::extents[2][n/2], vex::extents[1][0]); 
for(int i=0; i<n; i++) std::cout << vex_ints[i] << " "; std::cout << std::endl; 

Alles, was es tut Druck ist die geraden Zahlen, die kleiner als n durch die ungeraden Zahlen gefolgt, die kleiner als n sind. Zum Beispiel, wenn n = 10, es druckt:

Aber Dinge verhalten sich merkwürdig, wenn n groß wird. Zum Beispiel, wenn n = 10000, die ersten 50 gedruckt ganze Zahlen sind:

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 

Welche es falsch zu bekommen beginnt nach 62. Es gibt noch andere Unterschiede weiter unten in der Ausgabe, und einige sogar Zahlen auftreten, nachdem ungerade Zahlen. Kann jemand erklären, warum das passiert? Wenn es darauf ankommt, verwendete ich den Kontext "GeForce GT 650M (Apple)".

+1

Warum 'vex :: extents [1] [0]' auf einem 1D-Array? Sollte es nur 'vex :: extents [0]' sein? – DarkZeros

+0

Nun definiere ich die Form mit den vex :: extents-Objekten. Also sage ich in diesem Fall, dass die Matrix n/2 Zeilen mal 2 Spalten ist. Ich folgte dem Matrix-Umsetzungsbeispiel aus den Dokumenten. –

+0

Es ist unter dem Umformungsabschnitt [hier] (http://vexcl.readthedocs.io/en/latest/expressions.html#reshaping) –

Antwort

1

Der Kernel, der aus Ihrem Ausdruck generiert wird, verwendet vex_ints sowohl für die Eingabe als auch für die Ausgabe. Da das, was vex::reshape tut, im Grunde eine Permutation ist, können Sie das nicht an Ort und Stelle tun. Bitte versuchen Sie, das Ergebnis einem anderen Vektor zuzuordnen und sehen Sie, ob das Problem für Sie behoben wird.

+0

Das hat funktioniert. Vielen Dank! –