5 / 4 / 1
Регистрация: 03.11.2014
Сообщений: 34
1

Вычисления на видеокарте

13.12.2019, 01:54. Показов 1725. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть небольшое графическое приложение которое моделирует теплопередачу на пластине.
Графику использую встроенную Graphics.h и Graphics.сpp
Необходимо увеличить производительность приложения.
Так как это графические приложение первое что пришло на ум, запустить его через "Высокопроизводительный процессор nvidia", но оно не работает.
Помогите улучшить производительность приложения.
На гифке видно, что обновление идет волнами. Хотелось бы что бы их не было.

Основная программа
Кликните здесь для просмотра всего текста
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// plast20.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "Graphics.h"
using namespace std;
 
double h1=0.2;
double d=1.5;
double h=1.1;
//double a=0.15; //Вариант 1
//double a[]={0.03,0.07,0.09,0.05}; //Вариант 2
double a[36][36]; //Вариант 4
double l1=0.4;
double l2=0;
double gamma=2;
double l3=0;
double l4=0.3;
double T0=372;
double Tc=20; 
double u[40][40];
const int N=35;
const int M=35;
double tau=0.05,T=0;
 
void main(void) {
 
 
    
 
    for (int i = 0; i < 36; i++) {
        for (int j = 0; j < 36; j++) {
            if (i<0) a[i][j] = 0.000015;
            else a[i][j] = float((i + 1))/100;
            //a[i][j] = 0.15;
        }
    }
 
 
    for(int i=0; i<=M; i++) for(int j=0; j<=N; j++) u[i][j]=T0;
 
    initgraph(920,560);
    /*************************************************************************************/
    setbkcolor(RGB(0,93.578,255));
    bar(630, 50, 650, 70);
    outtextxy(670, 50, "349-359");
 
    setbkcolor(RGB(0,186.156,255));
    bar(630, 80, 650, 100); 
    outtextxy(670, 80, "359-369");
 
    setbkcolor(RGB(0,255,229.266));
    bar(630, 110, 650, 130);
    outtextxy(670, 110, "369-379");
 
    setbkcolor(RGB(0,255,135.688));
    bar(630, 140, 650, 160);
    outtextxy(670, 140, "379-389");
 
    setbkcolor(RGB(0,255,42.1101));
    bar(630, 170, 650, 190);
    outtextxy(670, 170, "389-399");
 
    setbkcolor(RGB(51.4679,255,0));
    bar(630, 200, 650, 220);
    outtextxy(670, 200, "399-409");
 
    setbkcolor(RGB(145.046,255,0));
    bar(630, 230, 650, 250);
    outtextxy(670, 230, "409-419");
 
    setbkcolor(RGB(238.624,255,0));
    bar(630, 260, 650, 280);
    outtextxy(670, 260, "419-429");
 
    setbkcolor(RGB(238.624,255,0));
    bar(630, 290, 650, 310);
    outtextxy(670, 290, "429-439");
 
    setbkcolor(RGB(255,84.2202,0));
    bar(630, 320, 650, 340);
    outtextxy(670, 320, "439-449");
 
    setbkcolor(RED);
    bar(630, 350, 650, 370);
    outtextxy(670, 350, "449>");
 
    /*************************************************************************************/
    //cin>>a;
    int k=0,l=0,n=0,t=0;
    double tt=0;
    while(tt<=38) {
 
        l=0;
        for(int i=0;i<=M;i++) {
            k=0;
            for(int j=0;j<=N;j++) {
                if(u[i][j]<=349&&u[i][j]>=320) {
                    setbkcolor(BLUE);
                    bar(5+k,5+l,20+k,20+l);
                } 
                else if(u[i][j]<=359&&u[i][j]>349) {
                    setbkcolor(RGB(0,93.578,255));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=369&&u[i][j]>359) {
                    setbkcolor(RGB(0,186.156,255));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=379&&u[i][j]>369) {
                    setbkcolor(RGB(0,255,229.266));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=389&&u[i][j]>379) {
                    setbkcolor(RGB(0,255,135.688));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=409&&u[i][j]>399) {
                    setbkcolor(RGB(0,255,42.1101));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=419&&u[i][j]>409) {
                    setbkcolor(RGB(51.4679,255,0));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=429&&u[i][j]>419) {
                    setbkcolor(RGB(145.046,255,0));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=439&&u[i][j]>429) {
                    setbkcolor(RGB(238.624,255,0));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=449&&u[i][j]>439) {
                    setbkcolor(RGB(238.624,255,0));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]<=459&&u[i][j]>449) {
                    setbkcolor(RGB(255,84.2202,0));
                    bar(5+k,5+l,20+k,20+l);
                }
                else if(u[i][j]>459) {
                    setbkcolor(RED);
                    bar(5+k,5+l,20+k,20+l);
                }
            k+=15.5;
            }
            l+=15.5;
        }
        n++;
        ///////////////////////////////////////////////////////////////////////
 
        //Гран 4    // c верху / верху
        for (int j = 0; j <= N; j++)
            u[0][j] = (l4*Tc*h1 + u[1][j]) / (1 + h1*l4);
        t = t + 1;
        //Гран 3 // c лева =0
        for (int i = 0; i <= N; i++)
            u[i][N] = (u[i][N - 1] + l1 * h1 * Tc) / (1 + l1 * h1);
        //Гран 2 // с низу L3=0.2
        for (int j = 0; j <= N; j++)
            u[N][j] = (u[N - 1][j] - l2*h1*Tc) / (1 - l2 * h1);  
        double z = t;
        //гран 1 //с права / лево
        for (int i = 0; i <= N; i++)
            //u[i][0] = T0 + gamma * z*tau;
            u[i][0] = 484;
 
 
        //cout<<n<<endl<<endl;
    /*  for (int i = 0; i <= N; i++)
        {
            for (int j = 0; j <= N; j++)
                cout <<u[i][j] << "\t";
            cout << endl;
        }
        cout<<endl<<endl;*/
        //system("PAUSE");
        for (int i = 1; i <= N - 1; i++)
            for (int j = 1; j <= N - 1; j++)
                u[i][j] = u[i][j] + tau * ((a[i][j] * (u[i + 1][j] - u[i][j]) - a[i-1][j] * (u[i][j] - u[i - 1][j]) / pow(h1, 2)) + (a[i][j]*(u[i][j + 1] - u[i][j]) - a[i][j-1]*(u[i][j] - u[i][j - 1])) / pow(h1, 2));
                    //u[i][j] = u[i][j] + tau * ((a[0] * (u[i + 1][j] - u[i][j]) - a[1] * (u[i][j] - u[i - 1][j]) / pow(h1, 2)) + (a[0]*(u[i][j + 1] - u[i][j]) - a[3]*(u[i][j] - u[i][j - 1])) / pow(h1, 2));
              
        tt+=0.01;
        
    }
    system("PAUSE");
}
Миниатюры
Вычисления на видеокарте  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2019, 01:54
Ответы с готовыми решениями:

Про вычисления на видеокарте
Хотелось бы спросить насчет этих самых вычислений на видеокартах, извиняюсь конечно за нубский...

Какой блок питания нужен видеокарте NVIDIA GeForce GTX 480? Видеокарте NVIDIA GeForce GTX 295?
Подскажите какой блок питания нужен видеокарте NVIDIA GeForce GTX 480? Видеокарте NVIDIA GeForce...

О видеокарте
Добрый день! у меня возник вопрос, недавно купил видеокарту с рук radeon hd 3650 agp 512 mb шина...

Артефакты на видеокарте
Добрый день. Начну с того что у меня Ноутбук с данными характеристиками : Intel Core i5 2.4 ггц с...

6
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
13.12.2019, 11:11 2
Цитата Сообщение от Realag Посмотреть сообщение
Графику использую встроенную Graphics.h и Graphics.сpp
запустить его через "Высокопроизводительный процессор nvidia"
graphics.h это "чуть-чуть лучше, чем ничего". Любой нормальной графической библиотеке она проигрывает. Впрочем, с таким разрешением даже она должна справляться.
Не анализируя ваш код (перемножения массивов в отсутствие комментариев не самая приятная для анализа штука), могу предложить два направления: оптимизировать расчет и использовать нормальную графику.
Но в первую очередь проверьте что именно у вас тормозит - математика или вывод. Закомментируйте всю математику и посчитайте fps. Потом закомментируйте вывод и снова посчитайте fps. Сравните с эталонным, когда обе части раскомментированы.
1
5 / 4 / 1
Регистрация: 03.11.2014
Сообщений: 34
13.12.2019, 16:36  [ТС] 3
Как оказалось тормозит именно вывод.
Математика полностью была закомментирована, и с фпс было все нормально.
Скорее всего проблема в самом Graphics.h.

Можете посоветовать какую-нибудь простенькую графическую библиотеку для такого вида задачи?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
13.12.2019, 17:20 4
Цитата Сообщение от Realag Посмотреть сообщение
Можете посоветовать какую-нибудь простенькую графическую библиотеку для такого вида задачи?
SDL
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
13.12.2019, 17:38 5
Лучший ответ Сообщение было отмечено Realag как решение

Решение

Цитата Сообщение от Raali Посмотреть сообщение
SDL
Вот пример создания окна и рисования на нем средствами OpenGL1 (вообще-то оно устарело и не рекомендуется к изучению, но для понимания все же проще, чем OpenGL2)
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 <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <SDL2/SDL.h>
 
int main(int argc, char **argv){
  SDL_GLContext context = NULL;
  SDL_Window *window = SDL_CreateWindow("Open GL + SDL window",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,
                            800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
  if(window == NULL){goto FINISH;} //не удалось создать окно - ошибка (на модели не обрабатывается)
  context = SDL_GL_CreateContext(window);
  if(context == NULL){goto FINISH;} //не удалось привязать OpenGL к окну - ошибка (не обрабатывается)
  //настройки OpenGL
  glClearColor(0,0,0,0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0,800, 0,600);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  
  while(1){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1,0,0);
    glBegin(GL_LINES);
      glVertex2i(10,10);
      glVertex2i(100,500);
    glEnd();
    SDL_GL_SwapWindow(window);
    
    SDL_Event event;
    SDL_PollEvent(&event);
    if(event.type == SDL_QUIT)break;
    if(event.type == SDL_KEYUP && event.key.keysym.scancode==SDL_SCANCODE_ESCAPE)break;
  }
FINISH:
  if(context){SDL_GL_DeleteContext(context); context=0;}
  if(window){SDL_DestroyWindow(window); window=0;}
  SDL_Quit();
  return 0;
}
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
13.12.2019, 17:42 6
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
вообще-то оно устарело и не рекомендуется к изучению
Интересно оно запускается на новых видюшках?)
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
13.12.2019, 18:33 7
Насколько я знаю, да. То ли по-нормальному поддерживают, то ли костылями. Вот в мобильной разработке и прочих экзотических местах уже могут быть проблемы, но там OGL1 изначально не было, так что это не проблема.
0
13.12.2019, 18:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2019, 18:33
Помогаю со студенческими работами здесь

Вопрос по видеокарте
Пишу сюда, не знал куда рисовать вопрос. Вполне возможно, кто то сталкивался с ремонтом видеокарт...

Вентиляторы на видеокарте
Вентиляторы на видеокарте внезапно останавливаются при запуске виндовс 10. Во время запуска они...

Диагноз видеокарте
Приветствую, помогите определить неисправность. У меня видеокарта жтс 450 1гб, 850 мгц. При обычных...

Windows 7 на 64 мб видеокарте?
Собственно, пойдет ли? на втором компе все подходит кроме видюхи, нвидиа 64 мб, а нужно 128 для...


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

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

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