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.

104 lines
2.2 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
  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. size = strtol(argv[1], &endptr, 10);
  37. if (*endptr){
  38. perror(" Invalid array size format\n");
  39. exit(1);
  40. }
  41. if (size <= 0){
  42. perror("The number of matrix dimension must be positive\n");
  43. exit(1);
  44. }
  45. N = size*size;
  46. c = (int*)malloc(N * sizeof(int));
  47. cudaMalloc((void**)&dev_a,N*sizeof(char));
  48. cudaMalloc((void**)&dev_b,N*sizeof(char));
  49. cudaMalloc((void**)&dev_c,N*sizeof(int));
  50. set<<<20,192>>>(dev_a,dev_b,N); //wypełaianie tablic a i b 'losowymi' wartościami
  51. cudaDeviceSynchronize(); //synchronizacja, bo inaczej pomar czasu nie ma sensu
  52. //czas start
  53. tt.Begin();
  54. //mnożenie a i b; c to wynik
  55. 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
  56. //czas stop
  57. cudaDeviceSynchronize();//synchronizacja, bo inaczej pomar czasu nie ma sensu
  58. time = tt.End();
  59. if(fasle){
  60. //kopiowanie tablicy 'c' z pamieci urządzenia do hosta co by można było to odczytać, wyswietlić itp.
  61. cudaMemcpy(c,dev_c,N*sizeof(int),cudaMemcpyDeviceToHost);
  62. for(int i=0;i<size;i++){
  63. printf("%d; ",c[i*size +i]); //wyswietlam tylko po przekatnej
  64. }
  65. }
  66. printf("czas: %ld ms\n" ,time);
  67. cudaFree(dev_c);
  68. cudaFree(dev_b);
  69. cudaFree(dev_a);
  70. free(c);
  71. return 0;
  72. }