Advertisement
Guest User

Untitled

a guest
May 24th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. Grid wieloblokowy, jeden wątek oblicza wiele sąsiednich elementów macierzy
  2. wynikowej, obliczenia przy wykorzystaniu pamięci współdzielonej bloku wątków.
  3. __global__ void matrixMultiplyWithDownsampling ( float * C , float * B , float * A , int
  4. MATRIX_SIZE , int skip ) {
  5. ...
  6. __shared__ float Sds [ BLOCK_SIZE ][ BLOCK_SIZE ];
  7. float sum [ BLOCK_SIZE ];
  8. for ( int x = 0 ; x < skip ; x ++)
  9. sum [ x ] = 0.0f;
  10. for ( int z = 0 ; z < MATRIX_SIZE ; z += BLOCK_SIZE ){
  11. for ( int x = 0 ; x < skip ; x ++)
  12. Sds [ ty ][ tx + x ] = A [( row )* MATRIX_SIZE + ( tx + x ) + z ];
  13. __syncthreads ();
  14. for ( int x = 0 ; x < skip ; x ++)
  15. for ( int i = 0 ; i < BLOCK_SIZE ; i ++)
  16. sum [[ x ] += Sds [ ty ][ i ] * B [ i * MATRIX_SIZE + col +
  17. ( z )* MATRIX_SIZE + x ];
  18. __syncthreads ();
  19. }
  20. for ( int x = 0 ; x < skip ; x ++)
  21. C [( row )* MATRIX_SIZE + col + x ] = sum [ x ];
  22. }
  23. Trzeci wariant podobnie jak drugi wykorzystuje wieloblokowy grid o wymiarach
  24. MATRIX_SIZE/BLOCK_SIZE, oraz korzysta z pamięci współdzielonej. W tej funkcji jednak możemy
  25. przydzielić wątkom zadanie wyliczenia nie tylko jednego elementu macierzy, ale także sąsiednich.
  26. Zmienna skip określa ile elementów macierzy wynikowej ma obliczyć każdy wątek. W
  27. zaproponowanym przez nas rozwiązaniu każdy wątek oblicza elementy znajdujące się w tym samym
  28. wierszu i sąsiadujących kolumnach. Obrazuje to poniższy rysunek (liczby w tabeli oznaczają numer
  29. wątku)
  30. 1 1 2 2
  31. 3 3 4 4
  32. 5 5 6 6
  33. 7 7 8 8
  34. Teraz CGMA ma wartość nie tylko zależną od wielkości bloku (tak samo jak w przypadku drugiej
  35. wersji programu), ale również od wartości skip - w naszym przypadku wynoszącej dwa.
  36. Podsumowując wartość CGMA dla powyższego kodu wyznacza się na podstawie danego wzoru:
  37. skip*wielkość_bloku*liczba_operacji/liczba_odwołań_do_pamięci. Tak samo jak w pozostałych
  38. wariantach tak i tutaj wartość liczby operacji i odwołań do pamięci wynosi dwa, tak więc
  39. podsumowując CGMA = 2* wielkość bloku (gdzie 2 to wybrana przez nas wartość skip)
  40. Teoretyczne zajętości procesora dla poszczególnych wielkości bloku wątków wynoszą:
  41. Dla bloku 8x8: 16,7%, dla bloku 16x16: 58,3%, dla bloku 32x32: 66,7%
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement