2016-04-05 4 views
-3

Ich bin ein Anfänger in OpenCL. Ich versuche, eine OpenCL Anwendung zu implementieren. Ich habe Zweifel, dass, wie openclKernel-Code schreiben. Ich habe einen ursprünglichen Code c gegeben.Wie verschachtelte Schleife in Kernel-Seite schreiben OpenCL

Frage: - helfen Sie mir, dass die gegebenen c-Code in openclKernel-Code zu ändern?.

ORIGINAL C CODE:

int i, j; 

// initialization of indexes 
for (i = 0; i<n; i++) 
    Index[i] = i; 

// Bubble sort 
for (i = 0; i<n - 1; i++) 
{ 
    for (j = i + 1; j<n; j++) 
    { 
     if (I[i] > I[j]) 
     { 
      double z = I[i]; // exchange attractiveness 
      I[i] = I[j]; 
      I[j] = z; 
      z = f[i];   // exchange fitness 
      f[i] = f[j]; 
      f[j] = z; 
      int k = Index[i]; // exchange indexes 
      Index[i] = Index[j]; 
      Index[j] = k; 
     } 
    } 
} 
+0

Es wird ungerade-gerade Sortierung nach Parallelisierung nur mit dem "if" -Teil geändert. –

+0

Bitte fügen Sie auch Ihren 'OpenCL'-Code-Entwurf ein und geben Sie optional an, was damit nicht stimmt oder mit welchen Teilen Sie Probleme haben. –

Antwort

1

Beispiel für 4096-Element-Arrays (alternate bubble1 und bubble2 mindestens 2048 mal ---> 4096 (N) kernel Ausführungen):

Index auf init Host-Seite seit seiner Zuweisung. Hilfsfunktionen:

void swap2p(__private int * I,int i,int j) 
{ 
     int tmp=I[i]; 
     I[i]=I[j]; 
     I[j]=tmp; 
} 
void swap2g(__global int * I,int i,int j) 
{ 
     int tmp=I[i]; 
     I[i]=I[j]; 
     I[j]=tmp; 
} 

Alternating kernel-1:

__kernel void bubble1(__global int * I, __global int * f, __global int * Index){ 
     int threadId=get_global_id(0); 
     __private int vals[2]; 

     if(threadId*2+1<4096) 
     { 
       vals[0]=I[threadId*2]; 
       vals[1]=I[threadId*2+1]; 
       if(vals[0]>vals[1]) 
       {  
        swap2p(vals,threadId*2,threadId*2+1); 
        swap2g(f,threadId*2,threadId*2+1); 
        swap2g(Index,threadId*2,threadId*2+1); 
        I[threadId*2]=vals[0]; 
        I[threadId*2+1]=vals[1]; 
       } 
     } 
} 

alternierende kernel-2:

__kernel void bubble2(__global int * I){ 
     int threadId=get_global_id(0); 
     __private int vals[2]; 

     if(threadId*2+2<4096) 
     { 
       vals[0]=I[threadId*2+1]; 
       vals[1]=I[threadId*2+2]; 
       if(vals[0]>vals[1]) 
       {  
        swap2p(vals,threadId*2+1,threadId*2+2); 
        swap2g(f,threadId*2+1,threadId*2+2); 
        swap2g(Index,threadId*2+1,threadId*2+2); 
        I[threadId*2+1]=vals[0]; 
        I[threadId*2+2]=vals[1]; 
       } 
     } 
} 

Globale Garnnummer: N/2 (2048)

+0

Ist es optimal, 3 XOR im globalen Speicher auszuführen? Ist es nicht besser, es nur in einer zeitlichen Variablen zu speichern? – DarkZeros

+0

Naja, Blasensortieren ist sowieso ziemlich schlecht: P. Ich denke, deine Lösung ist in Ordnung, aber die Swap-Sache hat mich dazu gebracht zu überlegen, was ein Swap oder ein XOR besser wäre .... – DarkZeros

+0

Du hast Recht, es hat% 50 mehr Zugriffe auf Vram. Jetzt sind es 4 Zugriffe mit tmp. Sogar "wenn" -Teil benötigt dieselben Variablen. –