Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RaZoR2008
4 / 4 / 0
Регистрация: 09.02.2009
Сообщений: 81
#1

Почему CUDA медленнее на простом коде? - C++

16.03.2013, 12:24. Просмотров 469. Ответов 1
Метки нет (Все метки)

Добрый день! Написал простую программу сравнения многократного запуска на CUDA и на CPU
Однако CUDA показывает 4539 мс на 1 миллион циклов, а CPU 1580 мс
Почему CUDA медленнее на простом коде

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Ядро исполнения на GPU
__global__ void
kernel(float *ex, float *v, float *hi, float *low, float *cl, int m)
{
  int i = blockIdx.x * blockDim.x + threadIdx.x;
  int j;
  if (i < m) 
  {
    j = ex[i];
    v[i] = low[j];
  }
}
 
// Главная функция
int main()
{
  int numBars = loadBars();
  int numExtr = defineExtremums(numBars);
 
  cout << "GPU kernel start:" << "\n";
  int N = numBars;
  int M = numExtr;
  float *ex, *z, *h, *l, *c;
  float *d_x, *d_xx, *d_y, *d_z, *d_w;
 
  int size_m = M * sizeof(float);
  int size_n = N * sizeof(float);
 
  ex = (float*)malloc(size_m);
  z = (float*)malloc(size_m);
  h = (float*)malloc(size_n);
  l = (float*)malloc(size_n);
  c = (float*)malloc(size_n);
 
  cudaMalloc(&d_x, size_m);
  cudaMalloc(&d_xx, size_m);
  cudaMalloc(&d_y, size_n);
  cudaMalloc(&d_z, size_n);
  cudaMalloc(&d_w, size_n);
 
  for (int i = 0; i < M; i++) 
  {
    ex[i] = extr[i];
  }
 
  for (int i = 0; i < N; i++) 
  {
    h[i] = high[i];
    l[i] = low[i];
    c[i] = close[i];
  }
 
  cudaMemcpy(d_x, ex, size_m, cudaMemcpyHostToDevice);
  cudaMemcpy(d_y, h, size_n, cudaMemcpyHostToDevice);
  cudaMemcpy(d_z, l, size_n, cudaMemcpyHostToDevice);
  cudaMemcpy(d_w, c, size_n, cudaMemcpyHostToDevice);
 
  dim3 threads = dim3(1024,1);
  dim3 blocks = dim3(N/threads.x,1);
 
  int numbench = 100000;
  clock_t t1 = clock();
  for (int u = 0; u < numbench; u++)
  {
    kernel<<<threads,blocks>>>(d_x, d_xx, d_y, d_z, d_w, M);
    cudaMemcpy(z, d_xx, size_m, cudaMemcpyDeviceToHost);
  }
  clock_t t2 = clock();
  clock_t t3 = t2-t1;
  cout << "GPU: " << t3 << "\n";
  
  clock_t t4 = clock();
    for (int u = 0; u < numbench; u++)
    {
    for(int i = 0; i < M; i++)
    {
        int j = ex[i];
        z[i] = low[j];
    }
    }
  clock_t t5 = clock();
  clock_t t6 = t5-t4;
  cout << "CPU: " << t6 << "\n";
 
  cudaFree(d_x);
  cudaFree(d_xx);
  cudaFree(d_y);
  cudaFree(d_z);
  cudaFree(d_w);
 
  free(ex);
  free(z);
  free(h);
  free(l);
  free(c);
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2013, 12:24     Почему CUDA медленнее на простом коде?
Посмотрите здесь:

C++ почему то первый в этом коде у меня не нулевой элемент а идет по порядку все
C++ Ошибка в простом коде
C++ Почему у меня ошибка в коде?
C++ Почему в книге пишут что cout не может работать без iostream в коде?
Ошибка в коде. Почему не правильно вызываю функцию? C++
C++ Почему вычисление числа Фибоначчи с помощью рекурсии медленнее, чем без нее?
Поиск очевидной ошибки в относительно простом коде C++
Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA C++
Почему в коде не работает перегрузка операторов? C++
Почему зацикливается код? (найти причины возникновения ошибок в коде) C++
Почему в данном случае работа с заранее выделенной памятью медленнее чем с динамической? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
__General__
24 / 24 / 3
Регистрация: 04.01.2014
Сообщений: 91
Завершенные тесты: 2
04.01.2014, 01:39     Почему CUDA медленнее на простом коде? #2
Добрый!
В подробностях изучать код, честно говоря, лень,
но скорее всего все дело в функции cudaMemcpy, которая работает "не мгновенно".

Добавлено через 8 минут
С помощью CUDA можно хорошо оптимизировать алгоритмы, время работы которых намного больше,
чем время, затрачиваемое на пересылку данных с хоста на устройство и обратно.
Yandex
Объявления
04.01.2014, 01:39     Почему CUDA медленнее на простом коде?
Ответ Создать тему
Опции темы

Текущее время: 12:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru