Advertisement
Guest User

C++ AMP

a guest
Apr 10th, 2017
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.78 KB | None | 0 0
  1. #include "cuda_runtime.h"
  2. #include "device_launch_parameters.h"
  3. #include <iostream>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <GL\freeglut.h>
  7. #include <omp.h>
  8. #include <string>
  9.  
  10. const int N = 1024;
  11. int button = 2;
  12. bool cuda_sw = false;
  13. float *CU_POSR, *CU_POSX, *CU_POSY, *CU_POSR_X, *CU_POSR_Y;
  14.  
  15. //for FPS
  16. float fps;
  17. int frames = 0;
  18. float time_f;
  19. float timebase = 0;
  20. char text[5 + 10] = "FPS: ";
  21. char res[5 + 10] = "FPS: ";
  22. char buff[10];
  23.  
  24. float POSX[N];
  25. float POSY[N];
  26. float POSR[N + N];
  27. float AX_M[N];
  28. float AY_M[N];
  29.  
  30.  
  31. void initialization()
  32. {
  33.     glClearColor(0, 0, 0, 1);
  34.     glMatrixMode(GL_PROJECTION);
  35.     glLoadIdentity();
  36.     gluOrtho2D(-1000, 1000, -1000, 1000);
  37. }
  38.  
  39.  
  40. void display()
  41. {
  42.     glClear(GL_COLOR_BUFFER_BIT);
  43.     glPushMatrix();
  44.     glBegin(GL_POINTS);
  45.  
  46.     for (int draw = 0; draw < N; draw++) {
  47.         glColor3f(1, 1, 1);
  48.         glVertex2f(POSX[draw] += POSR[draw], POSY[draw] += POSR[draw + N]);
  49.     }
  50.  
  51.     glEnd();
  52.  
  53.     glPopMatrix();
  54.     glutSwapBuffers();
  55.  
  56.     frames++;
  57.     time_f = glutGet(GLUT_ELAPSED_TIME);
  58.     if (time_f - timebase >= 1000)
  59.     {
  60.         fps = frames*1000.0 / (time_f - timebase);
  61.         timebase = time_f;
  62.         frames = 0;
  63.         strcpy(text, res);
  64.         glutSetWindowTitle(strcat(text, itoa(fps, buff, 10)));
  65.     }
  66. }
  67.  
  68.  
  69. void OMP_Math()
  70. {
  71.     float den;
  72. #pragma omp parallel for private(den, AX_M, AY_M)
  73.     for (int first = 0; first < N; first++) {
  74.         AX_M[first] = 0; AY_M[first] = 0;
  75.         for (int next = 0; next < N; next++) {
  76.             if ((first != next) && ((POSX[next] != POSX[first]) || (POSY[next] != POSY[first]))) {
  77.                 den = 100000 * sqrt((POSX[next] - POSX[first])*(POSX[next] - POSX[first]) + (POSY[next] - POSY[first])*(POSY[next] - POSY[first]));
  78.                 AX_M[first] += (POSX[next] - POSX[first]) / den;
  79.                 AY_M[first] += (POSY[next] - POSY[first]) / den;
  80.             }
  81.         }
  82.         POSR[first] += AX_M[first];
  83.         POSR[first + N] += AY_M[first];
  84.     }
  85. }
  86.  
  87.  
  88. __global__ void addKernel(float *POSX, float *POSY, float *POSR_X, float *POSR_Y, float *POSR)
  89. {
  90.     int first = threadIdx.x;
  91.     float  den;
  92.     POSR_X[first] = 0; POSR_Y[first] = 0;
  93.     for (int next = 0; next < N; next++) {
  94.         if ((first != next) && ((POSX[next] != POSX[first]) || (POSY[next] != POSY[first]))) {
  95.             den = 100000 * sqrt((POSX[next] - POSX[first])*(POSX[next] - POSX[first]) + (POSY[next] - POSY[first])*(POSY[next] - POSY[first]));
  96.             POSR_X[first] += (POSX[next] - POSX[first]) / den;
  97.             POSR_Y[first] += (POSY[next] - POSY[first]) / den;
  98.         }
  99.     }
  100.     POSR[first] += POSR_X[first];
  101.     POSR[first + N] += POSR_Y[first];
  102. }
  103.  
  104. void GPU_Math()
  105. {
  106.     cudaMalloc((void**)&CU_POSX, N * sizeof(int));
  107.     cudaMalloc((void**)&CU_POSY, N * sizeof(int));
  108.     cudaMalloc((void**)&CU_POSR_X, N * sizeof(int));
  109.     cudaMalloc((void**)&CU_POSR_Y, N * sizeof(int));
  110.     cudaMalloc((void**)&CU_POSR, 2 * N * sizeof(int));
  111.  
  112.     cudaMemcpy(CU_POSX, POSX, N * sizeof(int), cudaMemcpyKind::cudaMemcpyHostToDevice);
  113.     cudaMemcpy(CU_POSY, POSY, N * sizeof(int), cudaMemcpyKind::cudaMemcpyHostToDevice);
  114.     cudaMemcpy(CU_POSR_X, AX_M, N * sizeof(int), cudaMemcpyKind::cudaMemcpyHostToDevice);
  115.     cudaMemcpy(CU_POSR_Y, AY_M, N * sizeof(int), cudaMemcpyKind::cudaMemcpyHostToDevice);
  116.     cudaMemcpy(CU_POSR, POSR, 2 * N * sizeof(int), cudaMemcpyKind::cudaMemcpyHostToDevice);
  117.  
  118.     addKernel <<< 1, N >> >(CU_POSX, CU_POSY, CU_POSR_X, CU_POSR_Y, CU_POSR);
  119.  
  120.     cudaMemcpy(AX_M, CU_POSR_X, N * sizeof(int), cudaMemcpyKind::cudaMemcpyDeviceToHost);
  121.     cudaMemcpy(AY_M, CU_POSR_Y, N * sizeof(int), cudaMemcpyKind::cudaMemcpyDeviceToHost);
  122.     cudaMemcpy(POSX, CU_POSX, N * sizeof(int), cudaMemcpyKind::cudaMemcpyDeviceToHost);
  123.     cudaMemcpy(POSY, CU_POSY, N * sizeof(int), cudaMemcpyKind::cudaMemcpyDeviceToHost);
  124.     cudaMemcpy(POSR, CU_POSR, 2 * N * sizeof(int), cudaMemcpyKind::cudaMemcpyDeviceToHost);
  125.  
  126.     cudaFree(CU_POSX);
  127.     cudaFree(CU_POSY);
  128.     cudaFree(CU_POSR_X);
  129.     cudaFree(CU_POSR_Y);
  130.     cudaFree(CU_POSR);
  131. }
  132.  
  133. void Timer(int)
  134. {
  135.     if (button == 1)
  136.         GPU_Math();
  137.  
  138.     else
  139.         OMP_Math();
  140.  
  141.     display();
  142.     glutTimerFunc(0, Timer, 0);
  143. }
  144.  
  145.  
  146. void characters()
  147. {
  148.     for (int i = 0; i < N; i++) {
  149.         POSX[i] = rand() % 1000 - 500;
  150.         POSY[i] = rand() % 1000 - 500;
  151.  
  152.         for (int j = 0; j < i; j++) {
  153.             if ((i != j) && (POSX[i] == POSX[j]) && (POSY[i] == POSY[j]))
  154.                 i--;
  155.         }
  156.     }
  157. }
  158.  
  159.  
  160. void keyboard(unsigned char key, int x, int y)
  161. {
  162.     switch (key)
  163.     {
  164.     case '1': button = 1;
  165.         break;
  166.     case '2': button = 2;
  167.         break;
  168.     }
  169. }
  170.  
  171.  
  172. int main(int argc, char **argv)
  173. {
  174.     srand(time(0));
  175.     setlocale(LC_ALL, "russian");
  176.  
  177.     characters();
  178.  
  179.     std::cout << "[1] -- Select GPU\n";
  180.     std::cout << "[2] -- Select CPU\n";
  181.  
  182.     glutInit(&argc, argv);
  183.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  184.     glutInitWindowPosition(100, 100);
  185.     glutInitWindowSize(1000, 1000);
  186.     glutCreateWindow("");
  187.     glutDisplayFunc(display);
  188.  
  189.     glutTimerFunc(0, Timer, 0);
  190.     glutKeyboardFunc(keyboard);
  191.     initialization();
  192.     glutMainLoop();
  193.  
  194.     return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement