并行计算之向量的计算

谁践踏了优雅 2022-08-10 00:58 230阅读 0赞
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4. void Read_n(int* n_p, int* local_n_p, int my_rank,
  5. int comm_sz, MPI_Comm comm);
  6. void Allocate_vectors(double** local_x_pp,
  7. double** local_y_pp,
  8. double** local_z_pp,
  9. int local_n, MPI_Comm comm);
  10. void Read_vector(double local_a[], int local_n,
  11. int n, char vec_name[],
  12. int my_rank, MPI_Comm comm);
  13. void Print_vector(double local_b[], int local_n,
  14. int n, char title[],
  15. int my_rank, MPI_Comm comm);
  16. void Parallel_vector_sum(double local_x[],
  17. double local_y[],
  18. double local_z[],
  19. int local_n);
  20. int main(void) {
  21. int n, local_n;
  22. int comm_sz, my_rank;
  23. double *local_x, *local_y, *local_z;
  24. MPI_Comm comm;
  25. MPI_Init(NULL, NULL);
  26. comm = MPI_COMM_WORLD;
  27. MPI_Comm_size(comm, &comm_sz);
  28. MPI_Comm_rank(comm, &my_rank);
  29. Read_n(&n, &local_n, my_rank, comm_sz, comm);
  30. printf("Proc %d > n = %d, local_n = %d\n",
  31. my_rank, n, local_n);
  32. Allocate_vectors(&local_x, &local_y,
  33. &local_z, local_n, comm);
  34. Read_vector(local_x, local_n, n, "x", my_rank, comm);
  35. Print_vector(local_x, local_n, n, "x is", my_rank, comm);
  36. Read_vector(local_y, local_n, n, "y", my_rank, comm);
  37. Print_vector(local_y, local_n, n, "y is", my_rank, comm);
  38. Parallel_vector_sum(local_x, local_y, local_z, local_n);
  39. Print_vector(local_z, local_n, n, "The sum is",
  40. my_rank, comm);
  41. free(local_x);
  42. free(local_y);
  43. free(local_z);
  44. MPI_Finalize();
  45. return 0;
  46. }
  47. void Read_n(int* n_p, int* local_n_p, int my_rank,
  48. int comm_sz, MPI_Comm comm) {
  49. if (my_rank == 0) {
  50. printf("What's the order of the vectors?\n");
  51. scanf("%d", n_p);
  52. }
  53. MPI_Bcast(n_p, 1, MPI_INT, 0, comm);
  54. *local_n_p = *n_p/comm_sz;
  55. }
  56. void Allocate_vectors(double** local_x_pp,
  57. double** local_y_pp,
  58. double** local_z_pp,
  59. int local_n, MPI_Comm comm) {
  60. *local_x_pp = (double *)malloc(local_n*sizeof(double));
  61. *local_y_pp = (double *)malloc(local_n*sizeof(double));
  62. *local_z_pp = (double *)malloc(local_n*sizeof(double));
  63. }
  64. void Read_vector(double local_a[], int local_n,
  65. int n, char vec_name[],
  66. int my_rank, MPI_Comm comm) {
  67. double* a = NULL;
  68. int i;
  69. if (my_rank == 0) {
  70. a = (double *)malloc(n*sizeof(double));
  71. printf("Enter the vector %s\n", vec_name);
  72. for (i = 0; i < n; i++)
  73. scanf("%lf", &a[i]);
  74. MPI_Scatter(a, local_n, MPI_DOUBLE,
  75. local_a, local_n, MPI_DOUBLE, 0, comm);
  76. free(a);
  77. }
  78. else {
  79. MPI_Scatter(a, local_n, MPI_DOUBLE,
  80. local_a, local_n, MPI_DOUBLE, 0, comm);
  81. }
  82. }
  83. void Print_vector(double local_b[], int local_n,
  84. int n, char title[],
  85. int my_rank, MPI_Comm comm) {
  86. double* b = NULL;
  87. int i;
  88. if (my_rank == 0) {
  89. b = (double *)malloc(n*sizeof(double));
  90. MPI_Gather(local_b, local_n, MPI_DOUBLE, b,
  91. local_n, MPI_DOUBLE, 0, comm);
  92. printf("%s\n", title);
  93. for (i = 0; i < n; i++)
  94. printf("%f ", b[i]);
  95. printf("\n");
  96. free(b);
  97. }
  98. else {
  99. MPI_Gather(local_b, local_n, MPI_DOUBLE, b,
  100. local_n, MPI_DOUBLE, 0, comm);
  101. }
  102. }
  103. void Parallel_vector_sum(double local_x[],
  104. double local_y[],
  105. double local_z[],
  106. int local_n) {
  107. int local_i;
  108. for (local_i = 0; local_i < local_n; local_i++)
  109. local_z[local_i] = local_x[local_i] + local_y[local_i];
  110. }

VC6运行效果图

20151107212833744

MPI运行效果图

20151107212842332

发表评论

表情:
评论列表 (有 0 条评论,230人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用R语言计算相似性

    使用R语言计算向量的相似性 在数据分析和机器学习中,我们经常需要比较和计算向量之间的相似性。在R语言中,有多种方法可以用来计算向量的相似性,包括欧氏距离、余弦相似度和相关系数

    相关 计算夹角

    计算向量的夹角 在计算机图形学、机器学习和计算机视觉等领域,计算向量之间的夹角是一个常见的操作。夹角的计算可以帮助我们理解向量之间的关系,例如判断它们的相似性、计算它们的相似

    相关 CUDA 并行计算

    CUDA 并行计算 并行计算可以被定义为同时使用许多计算资源 (核心或计算机) 来执行并发计算,一个大的问题可以被分解成多个小问题,然后在不同的计算资源上并行处理这些小