2016-04-05 20 views
-3

Ben OpenCL acemi oldum. Ben bir OpenCL uygulama uygulamaya çalışıyorum. openclkernel kodu yazmak nasıl bir şüphe var. Orijinal bir c kodu verdim.Kernel tarafında Nested Loop nasıl yazılır OpenCL

Soru: - Beni openclçekirdek kod içine verilen c kodunu değiştirmek için yardımcı?.

ORİJİNAL Cı KODU:

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

O olur Sadece "if" parçası ile paralelleştikten sonra tek-çift sıralı değişti. –

+0

Lütfen OpenCL kod taslağınızı da yapıştırın ve isteğe bağlı olarak neyin yanlış olduğunu veya hangi kısımlarda sorun olduğunu söyleyin. –

cevap

1

Örnek 4096 için eleman dizileri (alternatif bubble1 ve bubble2 en az 2048 kat ---> 4096 (K), çekirdek infaz) init ile

göstergesi sadece atama beri ev sahibi tarafında. yardımcı fonksiyonları:

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; 
} 

Alternatif çekirdek 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]; 
       } 
     } 
} 

alternatif çekirdek-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]; 
       } 
     } 
} 

Küresel iplik numarası: N/2 (2048)

+0

Genel bellekte 3 XOR yapmak en uygun mu? Sadece geçici bir değişkende saklamak daha iyi değil mi? – DarkZeros

+0

Peki, kabarcık türü zaten oldukça kötü: P. Ben senin çözümün tamam, ama takas şey bana bir swap veya bir XOR daha iyi olacağını düşünmemi sağladı .... – DarkZeros

+0

Haklısın, bu vram için% 50 daha fazla erişim var. Şimdi tmp kullanarak 4 erişir. "If" parçasının bile aynı değişkenlere ihtiyacı vardır. –