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.

109 lines
2.3 KiB

8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
  1. #include <stdio.h>
  2. #include "Ttiming.h"
  3. __global__ void set(char *a,char *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) % 10;
  7. b[i] = 1 + (int)(cosf(i) * i * threadIdx.x) % 10;
  8. i+=blockDim.x * gridDim.x;
  9. }
  10. }
  11. __global__ void multiply(char *a,char *b,int *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. int 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 =0;
  28. int N;
  29. char *endptr;
  30. char *dev_a,*dev_b;
  31. int *dev_c;
  32. int *c;
  33. //do pomiaru czasu
  34. TTiming tt;
  35. long time;
  36. if(argc<2){
  37. perror("Usage error\n");
  38. exit(1);
  39. }
  40. size = strtol(argv[1], &endptr, 10);
  41. if (*endptr){
  42. perror(" Invalid array size format\n");
  43. exit(1);
  44. }
  45. if (size <= 0){
  46. perror("The number of matrix dimension must be positive\n");
  47. exit(1);
  48. }
  49. N = size*size;
  50. c = (int*)malloc(N * sizeof(int));
  51. cudaMalloc((void**)&dev_a,N*sizeof(char));
  52. cudaMalloc((void**)&dev_b,N*sizeof(char));
  53. cudaMalloc((void**)&dev_c,N*sizeof(int));
  54. set<<<16,192>>>(dev_a,dev_b,N); //wypełaianie tablic a i b 'losowymi' wartościami
  55. cudaDeviceSynchronize(); //synchronizacja, bo inaczej pomar czasu nie ma sensu
  56. //czas start
  57. tt.Begin();
  58. //mnożenie a i b; c to wynik
  59. multiply<<<16,192>>>(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
  60. //czas stop
  61. cudaDeviceSynchronize();//synchronizacja, bo inaczej pomar czasu nie ma sensu
  62. time = tt.End();
  63. if(false){
  64. //kopiowanie tablicy 'c' z pamieci urządzenia do hosta co by można było to odczytać, wyswietlić itp.
  65. cudaMemcpy(c,dev_c,N*sizeof(int),cudaMemcpyDeviceToHost);
  66. for(int i=0;i<size;i++){
  67. printf("%d; ",c[i*size +i]); //wyswietlam tylko po przekatnej
  68. }
  69. }
  70. printf("czas: %ld ms\n" ,time);
  71. cudaFree(dev_c);
  72. cudaFree(dev_b);
  73. cudaFree(dev_a);
  74. free(c);
  75. return 0;
  76. }