Dies ist mein erster Beitrag. Ich werde versuchen, es kurz zu halten, weil ich deine Zeit schätze. Diese Gemeinschaft war unglaublich für mich.Kann diese Parallelität in OpenCL implementiert werden
Ich lerne OpenCL und möchte ein wenig Parallelität aus dem folgenden Algorithmus extrahieren. Ich werde dir nur den Teil zeigen, an dem ich arbeite, den ich auch vereinfacht habe, soweit ich kann.
1) Eingänge: Zwei 1D-Arrays der Länge (n): A, B und Wert von n. Auch Werte C [0], D [0].
2) Ausgänge: Zwei 1D-Arrays der Länge (n): C, D.
C[i] = function1(C[i-1])
D[i] = function2(C[i-1],D[i-1])
So sind diese rekursive Definitionen, jedoch ist die Berechnung von C & D i für einen gegebenen Wert kann in geschehen parallel (sie sind offensichtlich komplizierter, um Sinn zu ergeben). Ein naiver Gedanke wäre zwei Arbeitselemente für die folgende Kernel erschaffen:
__kernel void test (__global float* A, __global float* B, __global float* C,
__global float* D, int n, float C0, float D0) {
int i, j=get_global_id(0);
if (j==0) {
C[0] = C0;
for (i=1;i<=n-1;i++) {
C[i] = function1(C[i-1]);
[WAIT FOR W.I. 1 TO FINISH CALCULATING D[i]];
}
return;
}
else {
D[0] = D0;
for (i=1;i<=n-1;i++) {
D[i] = function2(C[i-1],D[i-1]);
[WAIT FOR W.I. 0 TO FINISH CALCULATING C[i]];
}
return;
}
}
würde im Idealfall einen ersten Vergleich tut jeder der beiden Arbeitspositionen (Nummern 0,1) und dann ihre jeweilige Schleife eingeben, für jede Iteration zu synchronisieren . Angesichts der SIMD-Implementierung von GPUs gehe ich davon aus, dass dies NICHT funktionieren wird (Arbeitsaufgaben würden auf den gesamten Kernel-Code warten), aber ist es möglich, diese Art von Arbeit zwei CPU-Kernen zuzuordnen und funktioniert es wie erwartet? Was wird die Barriere in diesem Fall sein?
Müssen Sie alle Werte von C und D speichern, oder interessiert Sie nur das Endergebnis? – mfa
Können Sie bitte 'function1' und' function2' definieren? –