Форум программистов, компьютерный форум CyberForum.ru

Оптимизация доступа к памяти - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Counting sort http://www.cyberforum.ru/cpp-beginners/thread1665931.html
объясните пож что это означает. где индекс а где элемент
C++ Запишите рекуррентное уравнение для времени работы этой рекурсивной версии алгоритма сортировки вставкой Как записать рекуррентное уравнение для времени работы . Сортировку вставкой можно представить в виде рекурсивной последовательности следующим образом. Чтобы отсортировать массив A,сначала нужно выполнить сортировку массива A, после чего в этот отсортированный массив помещается элемент A. Запишите рекуррентное уравнение для времени работы этой рекурсивной версии алгоритма сортировки вставкой. http://www.cyberforum.ru/cpp-beginners/thread1665919.html
C++ Вычислить сумму целых частей элементов массива расположенных после последнего отрицательного элемента
Pomogite Pojaluista Вычислить сумму целых частей элементов массива, расположенных после последнего отрицательного элемента
C++ До ввода программа корректно читает данные, после - потоки выдают кракозябр
#include <iostream> #include <conio.h> #include <windows.h> #include <stdio.h> #include<string> #include<fstream> using namespace std; char *del_char(char* s, char c)
C++ Реализовать функцию, удаляющую в строке лидирующие и концевые пробелы http://www.cyberforum.ru/cpp-beginners/thread1665845.html
Удаляет в строке лидирующие и концевые пробелы. Возвращает указатель на преобразованную строку. Пишу впервые на С++ #include "stdafx.h" #include <iostream> void tr(char *s){ int i = 0, j = 0, c=0, k=0; c == strlen(s) / 3; while (s != c){ while (s != ' '){ i++;
C++ Найти в слове две одинаковые буквы В слове имеются только две одинаковые буквы. Найти их.(помогите пожалуйста) подробнее

Показать сообщение отдельно
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
20.02.2016, 16:20     Оптимизация доступа к памяти
Цитата Сообщение от maxm Посмотреть сообщение
При умножении матриц даст ли результат такая замена
Если бы ты замерил время, то были бы другие вопросы .Вот тебе пример для раздумий. А так, некоторые "оптимизации" в коде могут и испортить, другие могут дать неожиданный прирост

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
 
double **genArrMatrix(size_t height, size_t width) {
  std::default_random_engine generator;
  std::uniform_real_distribution<double> distribution(0.0,1.0);
 
  double **a = new double*[height];
  for(size_t i=0; i<height; ++i) {
    a[i] = new double[width];
    for(size_t j=0; j<width; ++j) {
      a[i][j] = distribution(generator);
    }
  }
  return a;
}
 
double **newArrMatrix(size_t height, size_t width) {
  std::default_random_engine generator;
  std::uniform_real_distribution<double> distribution(0.0,1.0);
 
  double **a = new double*[height];
  for(size_t i=0; i<height; ++i) {
    a[i] = new double[width];
  }  
  return a;
}
 
 
void deleteArrMatrix(double ** &arr_matrix, size_t height) {
  for(size_t i=0; i<height; ++i) {
    delete(arr_matrix[i]);
  }
  delete arr_matrix;
  arr_matrix = nullptr;
}
 
double **mul_v1_ArrMatrix(double **left, size_t height_left, size_t width_left, double **right, size_t width_right) {
  double **result = newArrMatrix(height_left, width_right);
  for (size_t i = 0; i < height_left; ++i) {
    for (size_t j = 0; j < width_right; ++j) {
      for (size_t k = 0; k < width_left; ++k)
      {
        result[i][j] += left[i][k] * right[k][j];
      }
    }
  }
  return result;
}
 
double **mul_v2_ArrMatrix(double **left, size_t height_left, size_t width_left, double **right, size_t width_right) {
  double **result = newArrMatrix(height_left, width_right);
  for (size_t i = 0; i < height_left; ++i) {
    for (size_t j = 0; j < width_right; ++j) {
      double sum =0;
      for (size_t k = 0; k < width_left; ++k)
      {
        sum += left[i][k] * right[k][j];
      }
      result[i][j] = sum;
    }
  }
  return result;
}
 
double **mul_v3_ArrMatrix(double **left, size_t height_left, size_t width_left, double **right, size_t width_right) {
  double **result = newArrMatrix(height_left, width_right);
  for (size_t j = 0; j < width_right; ++j) {
    for (size_t i = 0; i < height_left; ++i) {
      for (size_t k = 0; k < width_left; ++k)
      {
        result[i][j] += left[i][k] * right[k][j];
      }
    }
  }
  return result;
}
 
double **mul_v4_ArrMatrix(double **left, size_t height_left, size_t width_left, double **right, size_t width_right) {
  double **result = newArrMatrix(height_left, width_right);
  for (size_t j = 0; j < width_right; ++j) {
 
    double *tmp_column = new double[width_left];
    for(size_t k=0; k<width_left; ++k)
      tmp_column[k]=right[k][j];
 
    for (size_t i = 0; i < height_left; ++i) {
      for (size_t k = 0; k < width_left; ++k)
      {
        result[i][j] += left[i][k] * tmp_column[k];
      }
    }
 
    delete tmp_column;
  }
  return result;
}
 
int main() {
  const size_t n = 1000;
  const size_t m = 1000;
  const size_t k = 1000;
  
  using namespace std::chrono;
  high_resolution_clock::time_point t1, t2;
 
  std::cout << "Start:...\n";
 
  t1 = high_resolution_clock::now();
  double **A = genArrMatrix(n, m);
  t2 = high_resolution_clock::now();
  std::cout << "Time for generate A: "
            << duration_cast<duration<double>>(t2 - t1).count()
            << std::endl;
 
  t1 = high_resolution_clock::now();
  double **B = genArrMatrix(m, k);
  t2 = high_resolution_clock::now();                                       
  std::cout << "Time for generate B: "
            << duration_cast<duration<double>>(t2 - t1).count()
            << std::endl;
 
  t1 = high_resolution_clock::now();
  double **C1 = mul_v1_ArrMatrix(A, n, m, B, k);
  t2 = high_resolution_clock::now();
  std::cout << "Time for A*B v1: "
            << duration_cast<duration<double>>(t2 - t1).count()
            << std::endl;
 
//  deleteArrMatrix(C1, n);
 
  t1 = high_resolution_clock::now();
  double ** C2 = mul_v2_ArrMatrix(A, n, m, B, k);
  t2 = high_resolution_clock::now();
  std::cout << "Time for A*B v2: "
            << duration_cast<duration<double>>(t2 - t1).count()
            << std::endl;
 
  t1 = high_resolution_clock::now();
  double ** C3 = mul_v3_ArrMatrix(A, n, m, B, k);
  t2 = high_resolution_clock::now();
  std::cout << "Time for A*B v3: "
            << duration_cast<duration<double>>(t2 - t1).count()
            << std::endl;
 
  t1 = high_resolution_clock::now();
  double ** C4 = mul_v4_ArrMatrix(A, n, m, B, k);
  t2 = high_resolution_clock::now();
  std::cout << "Time for A*B v4: "
            << duration_cast<duration<double>>(t2 - t1).count()
            << std::endl;
 
  deleteArrMatrix(A, n);
  deleteArrMatrix(B, m);
  deleteArrMatrix(C1, n);
  deleteArrMatrix(C2, n);
  deleteArrMatrix(C3, n);
  deleteArrMatrix(C4, n);
  return 0;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ g++ -Wall -O -std=c++11 test_mult_matrix.cpp && ./a.out 
Start:...
Time for generate A: 0.0135852
Time for generate B: 0.0137066
Time for A*B v1: 7.86627
Time for A*B v2: 8.02966
Time for A*B v3: 7.41704
Time for A*B v4: 2.94677
$ g++ -Wall -std=c++11 test_mult_matrix.cpp && ./a.out 
Start:...
Time for generate A: 0.163797
Time for generate B: 0.16573
Time for A*B v1: 14.8662
Time for A*B v2: 10.3445
Time for A*B v3: 7.78858
Time for A*B v4: 4.48194
 
Текущее время: 19:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru