0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
1

Сложение элементов вектора (Проверить код на ошибки)

23.10.2021, 16:07. Показов 1121. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, пожалуйста, правильно ли я делаю суммирование элементов вектора? Если нет, то подскажите, как правильнее записать решение

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
#include "pch.h"
#include <execution>
#include <numeric>
#include <vector>
#include <iostream>
#include <iterator>
#include <functional>
#include <algorithm>
#include <random>
 
using namespace std;
 
vector<int> vec1;
vector<int> vec2;
vector<int> vec3;
 
int sum()
{
    for (int i = 0; i < vec1.size(); i++)
    {
        vec3[i] = vec1[i] + vec2[i];
    }
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Rus");
    clock_t start, end;
    int N = 5 * pow(10, 8);
    //int N = pow(10, 9);
    //int N = 2*pow(10,9);
    uniform_int_distribution<> dist(100000, 1000000);
    random_device rd;
    mt19937 gen(rd());
    vector <int> vector1(N);    
    for (int i = 0; i < N; i++)
    {
        vector1[i] = dist(gen);
    }
    start = clock();
    std::reduce(std::execution::par, vector1.begin(), vector1.end());
    end = clock();
    cout << "Время: " << (((double)end - start) / ((double)CLOCKS_PER_SEC)) << endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2021, 16:07
Ответы с готовыми решениями:

Сложение элементов вектора
Добрый день! Подскажите пожалуйста: есть вектор A=. Необходимо создать цикл чтобы подсчитывал сумму...

Сложение-вычитание динамических массивов (проверить код)
Здравствуйте. Задание: В программе оформить сложение или вычитание двух массивов. Размерность...

Найти отношение суммы не отрицательных и суммы отрицательных элементов вектора. Проверить код
Задан вектор f{f1,...,f8}. Найдите отношение \frac{S1}{S2}, где S1-сумма всех f&gt;=0, S2-сумма всех...

Проверить код на ошибки
Всем привет! У меня есть программа, которая выполняет параллельное решения уравнения...

Проверить код на ошибки
такая проблема что в print &quot;2&quot; l всегда выдает 2 1 REM sistema uravneni' 2 INPUT &quot;vvedite x&quot;; x...

12
79 / 53 / 26
Регистрация: 08.09.2019
Сообщений: 141
23.10.2021, 16:26 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <numeric>
 
int main()
{
    std::vector<int> v {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
    int sum = std::accumulate(v.begin(), v.end(), 0);
 
    std::cout << sum;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
23.10.2021, 17:58  [ТС] 3
crazy duck, проблема в том, что мне через reduce надо записывать решение. И вектор у меня не 0, 1, 2, ... ,9

Добавлено через 8 минут
если я использую политику seq, то время выполнения у меня 0 выдает, что-то не так для этой политики работает. А с другими политиками хоть какое-то адекватное врем получается. Не может ведь 0 получаться
0
440 / 283 / 183
Регистрация: 23.06.2018
Сообщений: 651
24.10.2021, 00:17 4
Цитата Сообщение от Катя6 Посмотреть сообщение
если я использую политику seq, то время выполнения у меня 0 выдает
Вы случаем это не в релизе тестируете?
В релизе компилятор просто делает небольшую оптимизацию и выкидывает код, который не имеет побочных эффектов и результат которого не используется.
Политика par запускает потоки, что, я так понимаю, является побочным эффектом.
0
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
24.10.2021, 09:39  [ТС] 5
Bleach163, в релизе тестирую, мне в нем и нужно как-раз. Поэтому, я не понимаю, это можно исправить, чтобы работало
0
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
24.10.2021, 10:05 6
Цитата Сообщение от Катя6 Посмотреть сообщение
я не понимаю, это можно исправить, чтобы работало
а чем собираете? Я попробовал в gcc собрать, работает и при par, и при seq

$ g++ -g -std=c++17 main.cpp -pthread -ltbb
$ ./a.out
Время: 11.0076
$ g++ -g -std=c++17 main.cpp -pthread -ltbb
$ ./a.out
Время: 7.06649
0
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
24.10.2021, 10:09  [ТС] 7
Я работаю в visual studio. А вообще, когда я тестирую для размерности 2*10^9, то у меня просто зависает все

Добавлено через 59 секунд
Может конечно как-то можно переписать код, чтобы он быстрее работал
0
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
24.10.2021, 10:34 8
Цитата Сообщение от Катя6 Посмотреть сообщение
Может конечно как-то можно переписать код, чтобы он быстрее работал
если взять за основу пример с https://en.cppreference.com/w/cpp/algorithm/reduce, то получается лучше, 10^9 тоже не тянет, но на 10^8 выдает приличные цифры

std::reduce (seq, long) result -925048832 took 6730.7 ms
std::reduce (par, long) result -925048832 took 2809.6 ms
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
#include <chrono>
#include <execution>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <utility>
#include <vector>
#include <random>
 
using namespace std;
 
int main()
{
    auto eval = [](auto fun) {
        const auto t1 = std::chrono::high_resolution_clock::now();
        const auto [name, result] = fun();
        const auto t2 = std::chrono::high_resolution_clock::now();
        const std::chrono::duration<double, std::milli> ms = t2 - t1;
        std::cout << std::fixed << std::setprecision(1) << name << " result " << result << " took " << ms.count() << " ms\n";
    };
    int N = 5 * pow(10, 8);
    uniform_int_distribution<> dist(100000, 1000000);
    random_device rd;
    mt19937 gen(rd());
    vector <int> v(N);
    for (int i = 0; i < N; i++)
    {
        v[i] = dist(gen);
    }
    eval([&v]{ return std::pair{"std::reduce (seq, long)",
        std::reduce(std::execution::seq, v.cbegin(), v.cend())}; } );
    eval([&v]{ return std::pair{"std::reduce (par, long)",
        std::reduce(std::execution::par, v.cbegin(), v.cend())}; } );
}
0
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
24.10.2021, 10:40  [ТС] 9
transetor, мне кажется это не совсем верное решение для данной задачи, потому что мне надо использовать эту строку: std::reduce(std::execution:ar, vector1.begin(), vector1.end()); и чтобы sum была прописана отдельно
0
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
24.10.2021, 10:52 10
можно так переписать

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
#include <chrono>
#include <execution>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <utility>
#include <vector>
#include <random>
 
using namespace std;
 
int main()
{
    int N = 5 * pow(10, 8);
    uniform_int_distribution<> dist(100000, 1000000);
    random_device rd;
    mt19937 gen(rd());
    vector <int> v(N);
    for (int i = 0; i < N; i++)
    {
        v[i] = dist(gen);
    }
 
    long long sum = 0;
 
    
    auto t1 = std::chrono::high_resolution_clock::now();
    sum = std::reduce(std::execution::seq, v.begin(), v.end());
    auto t2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> ms = t2 - t1;
    std::cout << std::fixed << std::setprecision(1) << " result sec: " << sum << " took " << ms.count() << " ms\n";
 
    sum = 0;
 
    t1 = std::chrono::high_resolution_clock::now();
    sum = std::reduce(std::execution::par, v.begin(), v.end());
    t2 = std::chrono::high_resolution_clock::now();
    ms = t2 - t1;
    std::cout << std::fixed << std::setprecision(1) << " result par: " << sum << " took " << ms.count() << " ms\n";
}
0
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
24.10.2021, 14:35  [ТС] 11
transetor, да я не такой вид имею ввиду. Программа должна выглядеть примерно также, как я пишу, но у меня там что-то не так с ней

Добавлено через 2 минуты
у меня задание звучит так: Используя параллельные алгоритмы стандартной библиотеки языка C++, написать программу, суммирующую элементы вектора. Указание. Использовать алгоритм std::reduce. Провести тестирование программы на векторах размера 5 ∙ 10^8, 10^9, 2 ∙ 10^9 с различными политиками выполнения.

Добавлено через 33 секунды
так что, 10^9 все-равно должно тестироваться
0
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
24.10.2021, 14:44 12
Цитата Сообщение от Катя6 Посмотреть сообщение
10^9 все-равно должно тестироваться
мой комп это не тянет, так что помочь не могу
0
440 / 283 / 183
Регистрация: 23.06.2018
Сообщений: 651
24.10.2021, 17:19 13
Цитата Сообщение от Катя6 Посмотреть сообщение
2 ∙ 10^9
Отдавать 7.5 ГБ памяти под один тест немного жирновато, но ладно...
Цитата Сообщение от Катя6 Посмотреть сообщение
что-то не так с ней
Нужно просто сохранить и вывести результат. Достаточно будет этих изменений:
C++
1
2
3
4
5
int sum = 0;
// При каждом вызове reduce
sum += std::reduce(...);
// В самом конце программы
std::cout << sum;
sum конечно же переполнится и не раз, но он всё равно переполняется внутри reduce.
Также не понимаю чем вам не нравится последний скинутый код. Убрали лишнее, используют более точные часики и главное - сохранили результат.
Касательно самих тестов - не знаю как в других компиляторах, но в MSVC внутри библиотеки execution висит комментарий, что сейчас par == par_unseq + для всего, кроме "семейства for_each", seq == unseq
А так это потестировал я.
Кликните здесь для просмотра всего текста
Результаты (для uint64_t в ~2 раза дольше):
Код
Init
Time to init: 7760.0518ms

Test 500000000 elements:
Time Seq:       94.5190ms
Time Unseq:     87.1033ms
Time Par:       54.9859ms
Time Par Unseq: 52.3544ms

Test 1000000000 elements:
Time Seq:       174.8330ms
Time Unseq:     173.9281ms
Time Par:       104.2727ms
Time Par Unseq: 106.0819ms

Test 2000000000 elements:
Time Seq:       349.9448ms
Time Unseq:     347.6190ms
Time Par:       208.6778ms
Time Par Unseq: 208.4607ms

Sum of sums: 7700138191862696
Код (местная подсветка синтаксиса не распознаёт апострофы в цифрах как декоративные разделители, но компилятор должен + заметьте, что я передал стартовое значение 0ull чтобы сумма не переполнилась):
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
#include <iostream>
#include <vector>
#include <random>
#include <numeric>
#include <iterator>
#include <execution>
 
using namespace std;
 
uint64_t testPolicies(const vector<int>& vec, size_t count) {
    vector<int>::const_iterator it_beg = vec.begin(), it_end = it_beg + count;
    chrono::high_resolution_clock::time_point start, end;
    chrono::duration<double, chrono::milliseconds::period> duration;
    uint64_t sum = 0;
 
    cout << "Test " << count << " elements:" << endl;
 
    start = chrono::high_resolution_clock::now();
    sum += reduce(execution::seq, it_beg, it_end, 0ull);
    end = chrono::high_resolution_clock::now();
    duration = end - start;
    cout << "Time Seq:       " << duration << endl;
 
    start = chrono::high_resolution_clock::now();
    sum += reduce(execution::unseq, it_beg, it_end, 0ull);
    end = chrono::high_resolution_clock::now();
    duration = end - start;
    cout << "Time Unseq:     " << duration << endl;
 
    start = chrono::high_resolution_clock::now();
    sum += reduce(execution::par, it_beg, it_end, 0ull);
    end = chrono::high_resolution_clock::now();
    duration = end - start;
    cout << "Time Par:       " << duration << endl;
 
    start = chrono::high_resolution_clock::now();
    sum += reduce(execution::par_unseq, it_beg, it_end, 0ull);
    end = chrono::high_resolution_clock::now();
    duration = end - start;
    cout << "Time Par Unseq: " << duration << endl;
 
    cout << endl;
 
    return sum;
}
 
int main()
{
    chrono::high_resolution_clock::time_point start, end;
    chrono::duration<double, chrono::milliseconds::period> duration;
    uint64_t sum = 0;
    size_t N = 2000'000'000;
    cout << fixed;
    cout.precision(4);
    cout << "Init" << endl;
    start = chrono::high_resolution_clock::now();
 
    uniform_int_distribution<> dist(100000, 1000000);
    random_device rd;
    mt19937 gen(rd());
    vector<int> vector1(N);
    for (int i = 0; i < N; i++)
    {
        vector1[i] = dist(gen);
    }
 
    end = chrono::high_resolution_clock::now();
    duration = end - start;
    cout << "Time to init: " << duration << endl << endl;
 
    sum += testPolicies(vector1, 500'000'000);
    sum += testPolicies(vector1, 1000'000'000);
    sum += testPolicies(vector1, 2000'000'000);
    cout << "Sum of sums: " << sum;
    return 0;
}
0
24.10.2021, 17:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2021, 17:19
Помогаю со студенческими работами здесь

проверить код на ошибки...
вычислить сумму положительных элементов матрицы, находящихся в тех строках, которые начинаются с...

Проверить код на ошибки.
.model small .386 .data z dw 0 .code begin: InputInt proc mov ah,0ah ...

Проверить код на ошибки
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; void main() { int n, A, B, X, i, j; do{ printf...

Проверить код на ошибки
Всем привет. Я новичек, начал изучать программирование. Первую программу слизал с примера в книге...

Проверить код программы на ошибки
Написал программу , но выводит ошибки. 5 KEY OFF 10 CLS 20 Q1=2:Q2=2 30 L=200:X2=0:S=5:R=5...

Как проверить на ошибки JSON код
Пользуясь #include &lt;DBXJSON.hpp&gt; в C++ Builder XE, как проверить JSON код на ошибки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru