2016-06-27 6 views
0

Ich erhalte einige scheinbar seltsame Ergebnisse, wenn ich versuche, eine float3 Variable in einem OpenCL-Kernel zu aktualisieren. Boiling es nach unten:OpenCL Konstruktor Syntax und Aktualisieren Variable

float3 vel = float3(0); // a 
vel = float3(0, 1, 0); // b 
vel = (float3)(0, 2, 0); // c 

Wenn ich vel nach jedem Anruf mit Druck:

if(get_global_id(0) == 0) 
    printf("[%d]: vel: (%f, %f, %f)\n", index, vel.x, vel.y, vel.z); 

Dann sehe ich das richtig a) vel initialisiert, aber b) nicht alles tun. c) funktioniert. Weiß jemand, warum ich die Variable nicht mit einem neuen float3 Objekt aktualisieren kann, wie ich in b mache? So bin ich es in C++ und Glsl gewohnt. Oder möglicherweise ein Treiberfehler?

Mit OpenCL 1.2 auf MacBook Pro mit OS X 10.11.5.

Antwort

2

Nur c) ist eine richtige Art und Weise der Initialisierung/mit Vektortypen. a) und b) ist möglicherweise ein Fehler in Mac-Implementierung (auf 2 GPUs und 1CPU habe ich versucht, die nicht kompiliert).

paar Möglichkeiten zur Initialisierung Vektortyp:

float3 vel = (float3)(1,1,1); 
float3 vel2 = (float3) 1; // it will be (1,1,1) 
float3 vel3 = 1; // it will be (1,1,1) 

Mehr über die Nutzung von Vektortypen: spec

2

In C hat der Komma-Operator sehr spezifische Semantik, wie im Detail here (oder kürzer here) beschrieben:

(a, b, c) ist eine Folge von Ausdrücken, die durch Kommata getrennt ist, die mit dem letzten Ausdruck auswertet c

Für Ihren zweiten Ansatz (b), bedeutet dies, dass Ihr Ausdruck nach unten zu float(0) kochen wird, mit dem Ihnen das gleichen Ergebnis wie im ersten Ansatz gibt (a).

Ihr dritter Ansatz (c) verwendet eine spezielle Syntax, die von OpenCL C eingeführt wurde, die die Initialisierung einzelner Elemente eines Vektors ermöglicht und somit nicht in diese Falle fällt.

+0

Wenn ich auf die Frage hinzufügen: Was bedeutet 'float3 (0, 1, 0)' kochen bis zu? float3 ist keine Klasse, hat keinen Konstruktor, und das ist nicht C++ ... Auch Fall a)? Wie funktioniert das überhaupt? – DarkZeros

+1

@DarkZeros Dies ist sicherlich nicht Standard-OpenCL C-Syntax, so wird wahrscheinlich nicht überall (oder sogar anderswo außer Apple) funktionieren. – jprice