Advertisement
kutuzzzov

Урок 9 Вглубь процессора

Nov 2nd, 2022
1,346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. // main
  2.  
  3. #include "log_duration.h"
  4.  
  5. #include <iostream>
  6. #include <numeric>
  7. #include <random>
  8. #include <string>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. vector<float> ComputeAvgTemp(const vector<vector<float>>& vs) {
  14.     // место для вашего решения
  15.     if (vs.empty()) return {};
  16.     int n = vs[0].size();
  17.     int m = vs.size();
  18.     vector<float> result(n);
  19.     vector<float> sum(n);
  20.     vector<float> size(n);
  21.    
  22.     for (int i = 0; i < n; ++i) {
  23.         sum = {};
  24.         size = {};
  25.        
  26.         for (int j = 0; j < m; ++j) {
  27.             sum[i] += (vs[j][i] > 0 ? vs[j][i] : 0);
  28.             size[i] += (vs[j][i] > 0 ? 1 : 0);
  29.         }
  30.         result[i] += (size[i] > 0 ? sum[i] / size[i] : 0);
  31.     }
  32.     return result;
  33. }
  34.  
  35. vector<float> GetRandomVector(int size) {
  36.     static mt19937 engine;
  37.     uniform_real_distribution<float> d(-100, 100);
  38.  
  39.     vector<float> res(size);
  40.     for (int i = 0; i < size; ++i) {
  41.         res[i] = d(engine);
  42.     }
  43.  
  44.     return res;
  45. }
  46.  
  47. int main() {
  48.     vector<vector<float>> data;
  49.     data.reserve(5000);
  50.  
  51.     for (int i = 0; i < 5000; ++i) {
  52.         data.push_back(GetRandomVector(5000));
  53.     }
  54.  
  55.     vector<float> avg;
  56.     {
  57.         LOG_DURATION("ComputeAvgTemp"s);
  58.         avg = ComputeAvgTemp(data);
  59.     }
  60.  
  61.     cout << "Total mean: "s << accumulate(avg.begin(), avg.end(), 0.f) / avg.size() << endl;
  62. }
  63.  
  64. // log_duration
  65.  
  66. #pragma once
  67.  
  68. #include <chrono>
  69. #include <iostream>
  70.  
  71. #define PROFILE_CONCAT_INTERNAL(X, Y) X##Y
  72. #define PROFILE_CONCAT(X, Y) PROFILE_CONCAT_INTERNAL(X, Y)
  73. #define UNIQUE_VAR_NAME_PROFILE PROFILE_CONCAT(profileGuard, __LINE__)
  74. #define LOG_DURATION(x) LogDuration UNIQUE_VAR_NAME_PROFILE(x)
  75.  
  76. class LogDuration {
  77. public:
  78.     // заменим имя типа std::chrono::steady_clock
  79.     // с помощью using для удобства
  80.     using Clock = std::chrono::steady_clock;
  81.  
  82.     LogDuration(const std::string& id) : id_(id) {
  83.     }
  84.  
  85.     ~LogDuration() {
  86.         using namespace std::chrono;
  87.         using namespace std::literals;
  88.  
  89.         const auto end_time = Clock::now();
  90.         const auto dur = end_time - start_time_;
  91.         std::cerr << id_ << ": "s << duration_cast<milliseconds>(dur).count() << " ms"s << std::endl;
  92.     }
  93.  
  94. private:
  95.     const std::string id_;
  96.     const Clock::time_point start_time_ = Clock::now();
  97. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement