fork download
  1. #include <amp.h>
  2. #include <chrono>
  3. #include <iostream>
  4. #include <numeric>
  5. #include <vector>
  6.  
  7. using namespace concurrency;
  8.  
  9. #define MAT_RANK 1024
  10. #define GPU
  11.  
  12. void multMatrixCPU(std::vector<int>& matA, std::vector<int>& matB, std::vector<int>& out)
  13. {
  14. for(unsigned int i=0; i<MAT_RANK; i++)
  15. {
  16. for(unsigned int j=0; j<MAT_RANK; j++)
  17. {
  18. int sum = 0;
  19. for(unsigned int k=0; k<MAT_RANK; k++)
  20. {
  21. sum += matA[i*MAT_RANK + k]*matB[k*MAT_RANK + j];
  22. }
  23. out[i*MAT_RANK + j] = sum;
  24. }
  25. }
  26. }
  27.  
  28. void multMatrixGPU(std::vector<int>& matA, std::vector<int>& matB, std::vector<int>& out)
  29. {
  30. array_view<const int, 2> inA(MAT_RANK, MAT_RANK, matA);
  31. array_view<const int, 2> inB(MAT_RANK, MAT_RANK, matB);
  32. array_view<int, 2> res(MAT_RANK, MAT_RANK, out);
  33. res.discard_data();
  34.  
  35. parallel_for_each(res.extent, [=](index<2> idx) restrict(amp) {
  36. int i = idx[0];
  37. int j = idx[1];
  38. int sum = 0;
  39. for(unsigned int k=0; k<MAT_RANK; k++)
  40. {
  41. sum += inA(i, k)*inB(k, j);
  42. }
  43. res(idx) = sum;
  44. });
  45. }
  46.  
  47. #include <wheels/stopwatch.h++>
  48.  
  49. int main(int argc, char* argv[])
  50. {
  51. std::vector<int> matA(MAT_RANK*MAT_RANK, 0);
  52. std::vector<int> matB(MAT_RANK*MAT_RANK, 0);
  53. std::vector<int> matC(MAT_RANK*MAT_RANK, 0);
  54.  
  55. std::iota(matA.begin(), matA.end(), 0);
  56. std::iota(matB.begin(), matB.end(), 0);
  57.  
  58. accelerator acc;
  59. std::wcout << "Device #:" << std::endl;
  60. std::wcout << "Desc:\t" << acc.get_description() << std::endl;
  61. std::wcout << "Path:\t" << acc.get_device_path() << std::endl;
  62. std::wcout << "Mem:\t" << acc.get_dedicated_memory() << std::endl;
  63. std::wcout << "Vers:\t" << (acc.get_version() >> 16) << '.' << (acc.get_version() & 0xFFFF) << std::endl;
  64. std::wcout << "IsEmu:\t" << acc.is_emulated << std::endl;
  65. std::wcout << std::endl;
  66.  
  67. wheels::stopwatch sw;
  68. #ifdef GPU
  69. multMatrixGPU(matA, matB, matC);
  70. #else
  71. multMatrixCPU(matA, matB, matC);
  72. #endif
  73. auto time = sw.elapsed();
  74. std::cout << "Process time: " << wheels::to_milliseconds(time) << " ms" << std::endl;
  75.  
  76. system("pause");
  77. return 0;
  78. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty