Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. #include "cuda_runtime.h"
  2. #include "device_launch_parameters.h"
  3.  
  4. #include <stdio.h>
  5.  
  6. #define blockSize 32
  7. #define f0 0.0
  8. #define f1 0.0
  9.  
  10. __global__ void kernel(double *u, double *uOld, double a, double b, double h, double tau, double r, int N)
  11. {
  12. int i = blockIdx.x * blockDim.x + threadIdx.x;
  13.  
  14. if (i == 0)
  15. {
  16. u[0] = f0;
  17. }
  18. else if (i == N - 1)
  19. {
  20. u[N - 1] = f1;
  21. }
  22. else
  23. {
  24. u[i] = r * (i * h) * (i * h) * ((u[i + 1] - u[i]) - (u[i] - u[i - 1])) - (uOld[i] - 2 * u[i]);
  25. uOld[i] = u[i];
  26. }
  27. }
  28.  
  29. double g(const double x)
  30. {
  31. return 0.5*x;
  32. }
  33.  
  34. double uol(const double x)
  35. {
  36. return 0.9*x;
  37. }
  38.  
  39.  
  40. int main()
  41. {
  42. double a = 1.0, L = 10.0, x = 0.0, time = 0.0, tmax = 10.0, tau = 0.001, h = 0.1, H = 1.0, b = 1.0;
  43. int N = (int)(L / h) + 1;
  44. double r = a * tau * tau / (h * h);
  45.  
  46. double *uDev = NULL, *uOldDev = NULL;
  47. int size = N * sizeof(double);
  48.  
  49. double *u = new double[N];
  50. double *uOld = new double[N];
  51. for (int i = 1; i < N - 1; i++)
  52. {
  53. u[i] = g(i*h);
  54. uOld[i] = u[i] - tau * uol(i*h);
  55. }
  56. u[0] = uOld[0] = f0;
  57. u[N - 1] = uOld[N - 1] = f1;
  58.  
  59. float calculationTime = 0.0f;
  60. cudaEvent_t tn, tk;
  61. cudaEventCreate(&tn);
  62. cudaEventCreate(&tk);
  63. cudaEventRecord(tn, 0);
  64.  
  65. cudaMalloc((void**)&uDev, size);
  66. cudaMalloc((void**)&uOldDev, size);
  67.  
  68. cudaMemcpy(uDev, u, size, cudaMemcpyHostToDevice);
  69. cudaMemcpy(uOldDev, uOld, size, cudaMemcpyHostToDevice);
  70.  
  71. do {
  72. kernel << < dim3(N / blockSize + 1), dim3(blockSize) >> > (uDev, uOldDev, a, b, h, tau, r, N);
  73. cudaDeviceSynchronize();
  74.  
  75. cudaMemcpy(uOldDev, uDev, size, cudaMemcpyDeviceToDevice);
  76.  
  77. time += tau;
  78. } while (time <= tmax);
  79.  
  80. cudaMemcpy(u, uDev, size, cudaMemcpyDeviceToHost);
  81.  
  82. cudaEventRecord(tk, 0);
  83. cudaEventSynchronize(tk);
  84. cudaEventElapsedTime(&calculationTime, tn, tk);
  85.  
  86. cudaError_t err = cudaGetLastError();
  87. const char* error = cudaGetErrorString(err);
  88. printf("Cuda error = %s\n", error);
  89.  
  90. if (err == cudaSuccess)
  91. {
  92. FILE* f = fopen("result.txt", "w");
  93.  
  94. for (int i = 0; i < N; i++)
  95. {
  96. fprintf(f, "u[%d] = %f\n", i, u[i]);
  97. }
  98.  
  99. fprintf(f, "\nTime = %f", calculationTime / 1000.0);
  100. fclose(f);
  101. }
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement