Advertisement
CAROJASQ

Untitled

Jul 4th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.78 KB | None | 0 0
  1. __kernel void getSuperK_M(
  2.    __global uint* RSK_G, // Matrix of reads
  3.    __global uint* counters, // Matrix of temporal output
  4.    __global uint* TMP, // Matrix of temporal output
  5.    const unsigned int nr, // Number of reads
  6.    const unsigned int r, // Read size
  7.    const unsigned int k, // Kmer size
  8.    const unsigned int m // m-mer size
  9.    )
  10. {
  11.    uint x, y, yl, xl, p, start, offset, nmk, nm, min, a, b, c, d, idt, ts, nt, lsd, nkr, tmp, ls, start_tile, start_superk, nt1, nt2, nt3, nt4 = 0;
  12.    bool flag;
  13.  
  14.    x = get_global_id(0);
  15.    y = get_global_id(1);
  16.    xl = get_local_id(0);
  17.    yl = get_local_id(1);
  18.  
  19.   __local uint RSK[180]; // Vector of a read and super k-mers (32 bits) , len = lenght of reads
  20.  
  21.   __local uint RCMT[7]; // Position of minimizer in each tile, (nm-1)/(ts)   +  1, ts -> (nm-1)/lsd   + 1, nm=r-m-1, lsd=localSpaceSize/m
  22.   __local uint MT[7]; // max(nt1, nt2) , max(nt anterior , nt nuevo)
  23.   __local uint counter, mp, nmp, minimizer; // minimizer position, new minimizer  position, minimizer
  24.  
  25.    nmk = k - m + 1;
  26.    // Global to local
  27.    ts = get_local_size(0);
  28.    nt1 = (r-1)/ts + 1; // nt: Number of tiles or number of sub-reads per read
  29.    if ((x<ts) && (x<r) && (y<nr)){
  30.       for (int i=0; i<nt1; i++) { // coalesced
  31.         p=ts*i+x;
  32.         if (p > r-1) {
  33.           break;
  34.         }
  35.         RSK[p]=RSK_G[y*r+p];
  36.       }
  37.     }
  38.     barrier(CLK_LOCAL_MEM_FENCE);
  39.  
  40.     // FUNCTION: GetM-mers
  41.     // Read to decimal representation of m-mers
  42.     lsd = get_local_size(0) / m;
  43.     nm = r - m + 1; // nm: Number of m-mers per read
  44.     ts = ((nm-1)/lsd) + 1; // ts: Tile size
  45.     nt2 = ((nm-1)/ts) + 1 ; // nt: Number of tiles or number of sub-reads per read
  46.     // a = (int) (pow(((double) 2, (double) (2*m)) - 1); // Mask
  47.     a = 63; // Mask
  48.  
  49.     if ((x < m*nt2) && (y<nr)) {
  50.       // Cómputo en pllo del primer m-mer de cada tile
  51.       idt = x/m;
  52.       start = ts*idt;
  53.       offset = x % m;
  54.       p = (start) + (offset);
  55.       MT[idt] = 0;
  56.       RCMT[idt] = 0;
  57.       b = RSK[p];
  58.       atomic_or(&MT[idt], (b << (m-(x%m)-1)*2));
  59.       atomic_or(&RCMT[idt], (((~b) & 3) << (x%m)*2));
  60.     }
  61.     barrier(CLK_LOCAL_MEM_FENCE);
  62.  
  63.     if ((x<nt2) && (y<nr)) {
  64.       idt = x;
  65.       start = ts*idt;
  66.       if (MT[idt]<RCMT[idt]){
  67.         RSK[start + m -1] = MT[idt];
  68.       } else {
  69.         RSK[start + m -1] = RCMT[idt];
  70.       }
  71.     }
  72.     barrier(CLK_LOCAL_MEM_FENCE);
  73.  
  74.       // Cómputo en serie del resto de m-mers de cada tile
  75.     if ((x<nt2) && (y<nr))  {
  76.        idt = x;
  77.        start = ts*idt;
  78.        c = MT[idt]; // Almacena en C el valor decimal del primer m-mer del tile
  79.        d = RCMT[idt];
  80.  
  81.        for (int z=0; z<(ts-1); z++) {
  82.             if (start+m+z > r-1) {
  83.             break;
  84.           }
  85.            b = RSK[start+m+z]; // Obtiene la siguiente base
  86.            c = ((c & a) << 2)|b; // Obtiene el valor decimal del m-mer (A partir del resultado   // anterior y la nueva base)
  87.            d = ((d>>2) & (a)) | (((~b) & 3)<<((m-1)*2));
  88.            if (c<d) {
  89.              RSK[start+m+z]=c;
  90.             } else {
  91.              RSK[start+m+z]=d;
  92.             }
  93.            }
  94.       }
  95.  
  96.       barrier(CLK_LOCAL_MEM_FENCE);
  97.  
  98.       nt = ((nm-1)/ts) + 1; // nt: Number of tiles or number of sub-reads per read
  99.  
  100.       // Extract MR_10 debuggin, TODO: Remove THIS
  101.       if ((x<=get_local_size(0)) && (y<nr)){
  102.         for (int i=0; i<nt; i++) { // coalesced
  103.           p=get_local_size(0)*i+x;
  104.           if (p > nm-1) {
  105.             break;
  106.           }
  107.           TMP[y*nm+p]=RSK[p];
  108.         }
  109.       }
  110.  
  111.    /* Initialization */
  112.    if (x==0) {
  113.      counter = 0;
  114.      mp = 0;
  115.      nmp = 0xFFFFFFFF;
  116.      minimizer = 0xFFFFFFFF;
  117.    }
  118.  
  119.   barrier(CLK_LOCAL_MEM_FENCE);
  120.  
  121.   start_tile = 0;
  122.   start_superk = 0;
  123.   if (k <= 36) {
  124.     nt3 = 6;
  125.   } else if (k <= 64) {
  126.     nt3 = 8;
  127.   } else if (k <= 100) {
  128.     nt3 = 10;
  129.   } else {
  130.     nt3 = 12;
  131.   }
  132.  
  133.   if (x<nmk) {
  134.     p = x;
  135.     b = RSK[p+m-1];
  136.   }
  137.  
  138.   if (x < nt3){
  139.     MT[x] = b;
  140.   }
  141.  
  142.   barrier(CLK_LOCAL_MEM_FENCE);
  143.  
  144.   if (x >= nt3 && x<nmk) {
  145.     atomic_min(&MT[x%nt3], b);
  146.   }
  147.  
  148.   barrier(CLK_LOCAL_MEM_FENCE);
  149.  
  150.   if (x<nt3) {
  151.     atomic_min(&minimizer, MT[x]);
  152.   }
  153.  
  154.  
  155.   barrier(CLK_LOCAL_MEM_FENCE);
  156.  
  157.   if ((x<nmk) && (b==minimizer)){
  158.     atomic_max(&mp, p);
  159.   }
  160.  
  161.   barrier(CLK_LOCAL_MEM_FENCE);
  162.  
  163.   // The reamaining k-mers
  164.   while ((start_tile+nmk-1)<(nm-1)) {
  165.     flag = false;
  166.     if ((x<nmk) && (mp == start_tile)){
  167.       flag = true;
  168.       printf("Start_tile =%d, mp=%d\n", start_tile, mp);
  169.       start_tile = start_tile + 1;
  170.       if (p < start_tile) {
  171.         p = p + nmk;
  172.         b = RSK[p + m - 1];
  173.       }
  174.     }
  175.  
  176.     if ( (x==0) && flag ) {
  177.       a = (start_tile + k - 1 - start_superk) & 0x000000FF;
  178.       //printf("1 start_tile, %d, PRE: Counter: %d , minimizer %d, x: %d, RSK[counter]: %d, a: %d\n", start_tile, counter, minimizer, x, RSK[counter], a);
  179.       RSK[counter] = ((minimizer<<18) & 0xFFFC0000) | ((start_superk<<8) & 0x0003FF00) | a;
  180.       //printf("1 POST: Counter: %d , minimizer %d, x: %d, RSK[counter]: %d, a: %d\n", counter, minimizer, x, RSK[counter], a);
  181.       counter++;
  182.       start_superk  = start_tile;
  183.     }
  184.  
  185.     if ((x<nt3) && (flag)) {
  186.       MT[x] = b;
  187.     }
  188.  
  189.     barrier(CLK_LOCAL_MEM_FENCE);
  190.  
  191.     if ((x >= nt3) && (x<nmk) && flag) {
  192.       atomic_min(&MT[x%nt3], b);
  193.     }
  194.  
  195.     barrier(CLK_LOCAL_MEM_FENCE);
  196.  
  197.     if ((x < nt3) && flag) {
  198.       atomic_min(&minimizer, MT[x]);
  199.     }
  200.  
  201.     barrier(CLK_LOCAL_MEM_FENCE);
  202.  
  203.     if ((x<nmk) && flag && (b == minimizer)) {
  204.       atomic_max(&mp, p);
  205.     }
  206.  
  207.     barrier(CLK_LOCAL_MEM_FENCE);
  208.  
  209.     if ((x<nmk) && flag==false) {
  210.       start_tile = mp;
  211.       if (p<start_tile) {
  212.         p = p + nmk;
  213.         if ( p < (nm -1)) {
  214.           b = RSK[p+m-1];
  215.           if (b < minimizer) {
  216.             atomic_min(&nmp, p);
  217.           }
  218.         }
  219.       }
  220.     }
  221.  
  222.     barrier(CLK_LOCAL_MEM_FENCE);
  223.  
  224.     if ((x==0) && (flag==false) && (nmp != 0xFFFFFFFF)) {
  225.       a = (nmp - start_superk + m - 1) & 0x000000FF;
  226.       printf("2 PRE: Counter: %d , minimizer %d, x: %d, RSK[counter]: %d, a: %d, nmp: %d, start_superk: %d\n", counter, minimizer, x, RSK[counter], a, nmp, start_superk);
  227.       //printf("2 computing, (minimizer <<  18) %d, (minimizer <<  18) & 0xFFFC00000) %d  ((start_superk << 8) & 0x0003F000) %d a %d", (minimizer <<  18), (minimizer <<  18) & 0xFFFC0000, ((start_superk << 8) & 0x0003F000), a);
  228.       RSK[counter] = ((minimizer <<  18) & 0xFFFC0000) | ((start_superk << 8) & 0x0003FF00) | a;
  229.       printf("2 POST: Counter: %d , minimizer %d, x: %d, RSK[counter]: %d, a: %d\n", counter, minimizer, x, RSK[counter], a);
  230.       mp = nmp;
  231.       minimizer = RSK[mp+m-1];
  232.       counter++;
  233.       start_superk = mp - nmk + 1;
  234.       nmp = 0xFFFFFFFF;
  235.     }
  236.  
  237.     barrier(CLK_LOCAL_MEM_FENCE);
  238.  
  239.   }
  240.  
  241.   if (x==0) {
  242.     a = (nm - start_superk + m - 1) & 0x000000FF;
  243.     printf("3 PRE: Counter: %d , minimizer %d, x: %d, RSK[counter]: %d, a: %d\n", counter, minimizer, x, RSK[counter], a);
  244.     RSK[counter] = ((minimizer << 18) & 0xFFFC0000) | ((start_superk<<8) & 0x0003FF00) | a;
  245.     printf("3 POST: Counter: %d , minimizer %d, x: %d, RSK[counter]: %d, a: %d\n", counter, minimizer, x, RSK[counter], a);
  246.     counter ++;
  247.   }
  248.  
  249.   barrier(CLK_LOCAL_MEM_FENCE);
  250.  
  251.     //FUNCTION: Local2Global
  252.     //Reads in local memory to Read in global memory
  253.     ts = get_local_size(0);  // ts: Tile size, work group size
  254.     nt4 = (r-1)/ts + 1; // nt: Number of tiles
  255.  
  256.     if ((x<ts) && (x<counter) && (y<nr)) {
  257.       for (int i=0; i<nt4; i++){  // coalesced
  258.         p=ts*i+x;
  259.         if (p > counter-1)
  260.           {
  261.             break;
  262.           }
  263.         RSK_G[y*r+p] = RSK[p];
  264.       }
  265.     }
  266.  
  267.    // Extract counters
  268.     if ((x == 0) && (y<nr))
  269.      {
  270.              counters[y] = counter;
  271.       }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement