You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.2 KiB

8 years ago
  1. #include <stdio.h>
  2. #include "Ttiming.h"
  3. __global__ void set(int *a,int *b, int N){
  4. int i =blockIdx.x * blockDim.x + threadIdx.x; //patrz w niej w 'multiply'
  5. while(i<N){
  6. a[i] = 1 + (int)(sinf(i) * i * threadIdx.x) % 20;
  7. b[i] = 1 + (int)(cosf(i) * i * threadIdx.x) % 20;
  8. i+=blockDim.x * gridDim.x;
  9. }
  10. }
  11. __global__ void multiply(int *a,int *b,long *c, int N){
  12. int i =blockIdx.x * blockDim.x + threadIdx.x; //obliczam którą komurkę tablicy mam liczyć, fajne wytłumaczenie o co chodzi jest w "cuda w przykładach" na stronie 47
  13. long sum = 0;
  14. int temp,temp2;
  15. while(i<N*N){
  16. temp = (int)floor((float)(i/N*N));
  17. temp2 = i%N;
  18. for(int j=0;j<N;j++){
  19. sum +=a[temp + j] * b[j*N + temp2 ];
  20. }
  21. c[i]=sum;
  22. sum =0;
  23. i+=blockDim.x * gridDim.x; //inkrementacja o ilość wszystkich 'watków'
  24. }
  25. }
  26. int main(int argc, char *argv[]){
  27. int size;
  28. int N;
  29. char *endptr;
  30. int *dev_a,*dev_b;
  31. long *dev_c;
  32. long *c;
  33. //do pomiaru czasu
  34. TTiming tt;
  35. long time;
  36. size = strtol(argv[1], &endptr, 10);
  37. if (*endptr)
  38. {
  39. perror(" Invalid array size format\n");
  40. exit(1);
  41. }
  42. if (size <= 0)
  43. {
  44. perror("The number of matrix dimension must be positive\n");
  45. exit(1);
  46. }
  47. N = size*size;
  48. c = (long*)malloc(N * sizeof(long));
  49. cudaMalloc((void**)&dev_a,N*sizeof(int));
  50. cudaMalloc((void**)&dev_b,N*sizeof(int));
  51. cudaMalloc((void**)&dev_c,N*sizeof(long));
  52. set<<<20,192>>>(dev_a,dev_b,N); //wypełaianie tablic a i b 'losowymi' wartościami
  53. cudaDeviceSynchronize(); //synchronizacja, bo inaczej pomar czasu nie ma sensu
  54. //czas start
  55. tt.Begin();
  56. //mnożenie a i b; c to wynik
  57. multiply<<<10,384>>>(dev_a,dev_b,dev_c,size); //takie wartosći <<<10,384>>> bo jest dla nich najszybsze, ale jeszcze zrobie dokładne testy i ewentualnie je poprawie
  58. //czas stop
  59. cudaDeviceSynchronize();//synchronizacja, bo inaczej pomar czasu nie ma sensu
  60. time = tt.End();
  61. if(false){
  62. //kopiowanie tablicy 'c' z pamieci urządzenia do hosta co by można było to odczytać, wyswietlić itp.
  63. cudaMemcpy(c,dev_c,N*sizeof(long),cudaMemcpyDeviceToHost);
  64. for(int i=0;i<N;i++){
  65. printf("%ld; ",c[i]);
  66. }
  67. }
  68. printf("czas : %ld ms\n" ,time);
  69. cudaFree(dev_c);
  70. cudaFree(dev_b);
  71. cudaFree(dev_a);
  72. free(c);
  73. return 0;
  74. }