Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
1

Не выполняется цикл

28.01.2019, 09:23. Показов 544. Ответов 2
Метки нет (Все метки)

Делаю многопоточную небольшую программу и столкнулся с такой проблемой. При 100 000 вычислений в стеке не хватает место для вывода, потому я убрал вывод в консоль и просто замерил время работы. Делаю для сравнения. Но вот беда при отсутствии вывода в консоль цикл не выполняется. Почему так происходит? Думаю код лучше скажет. Технология OpenMP
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
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
 
#define N 100000
 
int main(int argc, char *argv[])
{
 
    clock_t t1, t2;
 
    int i;
 
    // double a[N], b[N], c[N];
 
    double* a = (double*)malloc(N * sizeof(double));
    double* b = (double*)malloc(N * sizeof(double));
    double* c = (double*)malloc(N * sizeof(double));
    
    omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
    omp_set_num_threads(4); // установить число потоков в 4
 
    // инициализируем массивы
    for (i = 0; i <= N; i++) {
        a[i] = i;
        b[i] = i*2 ;
    }
 
     t1 = clock();
 
    // вычисляем сумму массивов
   #pragma omp parallel for shared(a, b, c) private(i) 
    for (i = 0; i < N; i++) {
        c[i] = a[i] + b[i];
    }
 
    t2 = clock();
 
   // for (i=0; i<N; i++)    printf ("%f\n", c[i]);
    
   
    
    float diff = ((t2 - t1)/1000.0F ) * 1000; 
    
    printf ("%f\n", diff);   
 
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2019, 09:23
Ответы с готовыми решениями:

Не выполняется цикл
else //1 файл { NameFilesExcel.push_back(ofn.lpstrFile); for (int k =...

Долго выполняется цикл
Добрый день или вечер)) Есть цикл for, который выполняется в потоке. Он занимается заполнением...

Цикл выполняется бесконечно
AnsiString S1,S2; float Year1, Day1, Month1, Year2, Day2, Month2; S1=DateTimePicker1-&gt;Date;...

Почему не выполняется цикл?
Здравствуйте. Вот код: int main() { vector &lt;Book&gt; books; Book item = Book(); ...

2
Мозгоправ
1724 / 1020 / 466
Регистрация: 01.10.2018
Сообщений: 2,129
Записей в блоге: 2
31.01.2019, 00:06 2
Попробуйте так:
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
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <chrono>
#include <cmath>
 
#define N 100000000
 
int main(int argc, char *argv[]) {
 
    int i;
 
    // double a[N], b[N], c[N];
 
    double* a = (double*)malloc(N * sizeof(double));
    double* b = (double*)malloc(N * sizeof(double));
    double* c = (double*)malloc(N * sizeof(double));
 
    omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
    omp_set_num_threads(4); // установить число потоков в 4
 
    // инициализируем массивы
    for (i = 0; i <= N; i++) {
        a[i] = i;
        b[i] = i * 2;
    }
 
    auto start = std::chrono::high_resolution_clock::now();
 
    // вычисляем сумму массивов
#pragma omp parallel for shared(a, b, c) private(i) 
    for (i = 0; i < N; i++) {
        c[i] = sqrt(a[i] * a[i] + b[i] * b[i]);
    }
 
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff = end - start;
 
    for (i = 0; i < N; i++)
        if (i % (N / 10) == 0)
            printf("%lf\n", c[i]);
    printf("elapsed time: %lf sec.\n", diff.count());
 
    return 0;
}
Цитата Сообщение от lephin Посмотреть сообщение
При 100 000 вычислений в стеке не хватает место для вывода
Стек тут ни при чём. Вы неправильно формат указали. Должно быть
C++
1
for (i=0; i<N; i++)    printf ("%lf\n", c[i]);
У вас массив c типа double.
0
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
31.01.2019, 11:52  [ТС] 3
Вопрос я решил уже. Спасибо за отзыв. Теперь мне больше интересно сама OpenMP. Опытным путем я установил, что данная программа выполнятся быстрее при трех потоках. Однако никогда не грузит CPU на 100%, максимальная загрузка это 50%. Почему так происходит? Потому-что вот включая третьего Ведьмака, допустим как пример, загрузка CPU доходит и до 95%. Почему я не могу своей программой максимально загрузить CPU? Что я не так делаю? У меня i3 два ядра, 4 потока
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2019, 11:52

Неправильно выполняется цикл do while
Есть код: #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main(){...

Почему цикл выполняется бесконечно?
Объясните кто-нибудь, почему этот код #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main() { ...

Цикл выполняется один раз
Здравствуйте! Помогите, пожалуйста с задачей. Пусть а=а=1. а = а + а/2к-1 где...

Цикл внутри условия не выполняется
Есть функция bool collision() { for (int i = int(y); i &lt; tileHeight; ++i) { for (int j...

Не выполняется цикл во втором потоке
Необходимо протабулировать функцию F(x)=x*sin(x) на заданном интервале Действия цикла выполняются...

Цикл while выполняется два раза подряд
Есть такой код, у меня этот цикл выполняется 2 раза за одно нажатие клавиши, в чем может проблема?...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.