Advertisement
Guest User

task1

a guest
Apr 23rd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdbool.h>
  5. #include <cuda.h>
  6. #include <cuda_runtime.h>
  7.  
  8. #define CUDA_CHECK_RETURN(value) {\
  9. cudaError_t _m_cudaStat = value;\
  10. if (_m_cudaStat != cudaSuccess) {\
  11. fprintf(stderr, "Error %s at line %d in file %s\n",\
  12. cudaGetErrorString(_m_cudaStat),__LINE__,__FILE__);\
  13. exit(1);\
  14. }}
  15.  
  16. float cuda_host_alloc_test(int size, int niter, bool up)
  17. {
  18. cudaEvent_t start, stop;
  19. int *a, *dev_a;
  20. float elapsed_time;
  21.  
  22. CUDA_CHECK_RETURN(cudaEventCreate(&start)); // Создание объекта события start
  23. CUDA_CHECK_RETURN(cudaEventCreate(&stop)); // Создание объекта события stop
  24.  
  25. // Выделение закреплённой памяти
  26. CUDA_CHECK_RETURN(cudaHostAlloc((void**)&a, size * sizeof(*a), cudaHostAllocDefault)); // Выделяет закреплённую страницу памяти на хосте
  27. // (указатель устройства на выделенную память, запрошенный размер выделения в байтах, запрашиваемые свойства выделенной памяти)
  28. // cudaHostAllocDefault - эквивалентность cudaHostAlloc и cudaMallocHost
  29. CUDA_CHECK_RETURN(cudaMalloc((void**)&dev_a, size * sizeof(*dev_a))); // Выделяет память на устройстве
  30. // (указатель на выделенную память устройства, запрошенный размер выделения в байтах)
  31.  
  32. CUDA_CHECK_RETURN(cudaEventRecord(start, 0)); // Записывает событие start
  33.  
  34. for (int i = 0; i < niter; i++) {
  35. if (up == true) {
  36. CUDA_CHECK_RETURN(cudaMemcpy(dev_a, a, size * sizeof(*a), cudaMemcpyHostToDevice)); // Копирует данные между хостом и устройством
  37. // (адрес памяти назначения, адрес источника памяти, размер в байтах для копирования, тип перевода.
  38. }
  39. else {
  40. CUDA_CHECK_RETURN(cudaMemcpy(a, dev_a, size * sizeof(*dev_a), cudaMemcpyDeviceToHost));
  41. }
  42. }
  43.  
  44. CUDA_CHECK_RETURN(cudaEventRecord(stop, 0)); // Записывает событие stop
  45. CUDA_CHECK_RETURN(cudaEventSynchronize(stop)); // Ожидание завершения события stop
  46. CUDA_CHECK_RETURN(cudaEventElapsedTime(&elapsed_time, start, stop)); // Вычисляет прошедшее время между событиями
  47.  
  48. CUDA_CHECK_RETURN(cudaFreeHost(a)); // Освобождает закреплённую страницу памяти
  49. CUDA_CHECK_RETURN(cudaFree(dev_a)); // Освобождает память на устройстве
  50.  
  51. CUDA_CHECK_RETURN(cudaEventDestroy(start)); // Уничтожает событие start
  52. CUDA_CHECK_RETURN(cudaEventDestroy(stop)); // Уничтожает событие stop
  53.  
  54. return elapsed_time;
  55. }
  56.  
  57. float cuda_malloc_test(int size, int niter, bool up)
  58. {
  59. cudaEvent_t start, stop;
  60. int *a, *dev_a;
  61. float elapsed_time;
  62.  
  63. CUDA_CHECK_RETURN(cudaEventCreate(&start)); // Создание объекта события start
  64. CUDA_CHECK_RETURN(cudaEventCreate(&stop)); // Создание объекта события stop
  65.  
  66. a = (int*)malloc(size * sizeof(*a));
  67.  
  68. CUDA_CHECK_RETURN(cudaMalloc((void**)&dev_a, size * sizeof(*dev_a))); // Выделяет память на устройстве
  69.  
  70. CUDA_CHECK_RETURN(cudaEventRecord(start, 0)); // Записывает событие start
  71.  
  72. for (int i = 0; i < niter; i++) {
  73. if (up == true) {
  74. CUDA_CHECK_RETURN(cudaMemcpy(dev_a, a, size * sizeof(*a), cudaMemcpyHostToDevice)); // Копирует данные между хостом и устройством
  75. }
  76. else
  77. CUDA_CHECK_RETURN(cudaMemcpy(a, dev_a, size * sizeof(*dev_a), cudaMemcpyDeviceToHost));
  78. }
  79.  
  80. CUDA_CHECK_RETURN(cudaEventRecord(stop, 0)); // Записывает событие stop
  81. CUDA_CHECK_RETURN(cudaEventSynchronize(stop)); // Ожидание завершения события stop
  82. CUDA_CHECK_RETURN(cudaEventElapsedTime(&elapsed_time, start, stop)); // Вычисляет прошедшее время между событиями
  83.  
  84. free(a);
  85. CUDA_CHECK_RETURN(cudaFree(dev_a)); // Освобождает память на устройстве
  86. CUDA_CHECK_RETURN(cudaEventDestroy(start)); // Уничтожает событие start
  87. CUDA_CHECK_RETURN(cudaEventDestroy(stop)); // Уничтожает событие stop
  88.  
  89. return elapsed_time;
  90. }
  91.  
  92. int main(int argc, char const *argv[])
  93. {
  94. const int size = (10 * pow(1024, 2));
  95. const int niter = 100; // Количество нитей
  96. float elapsed_time;
  97. float MB = (float)niter * size * sizeof(int) / 1024 / 1024; // Объём данных
  98.  
  99. elapsed_time = cuda_malloc_test(size, niter, true);
  100. printf("Time using cudaMalloc: %.6f\n", elapsed_time); // Использование выделения памяти обычным образом
  101. printf("Speed CPU-->GPU: %.6f MB/s\n\n", MB / (elapsed_time / 1000)); // Host to Device
  102.  
  103. elapsed_time = cuda_malloc_test(size, niter, false);
  104. printf("Time using cudaMalloc: %.6f\n", elapsed_time);
  105. printf("Speed GPU-->CPU: %.6f MB/s\n\n", MB / (elapsed_time / 1000)); // Device to Host
  106.  
  107. elapsed_time = cuda_host_alloc_test(size, niter, true);
  108. printf("Time using cudaHostAlloc: %.6f\n", elapsed_time); // Использование выделения памяти с использованием закреплённых страниц
  109. printf("Speed CPU-->GPU: %.6f MB/s\n\n", MB / (elapsed_time / 1000)); // Host to Device
  110.  
  111. elapsed_time = cuda_host_alloc_test(size, niter, false);
  112. printf("Time using cudaHostAlloc: %.6f ms\n", elapsed_time);
  113. printf("Speed GPU-->CPU: %.6f MB/s\n\n", MB / (elapsed_time / 1000)); // Device to Host
  114.  
  115. return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement