- ru.wikipedia.org
Ein kurzer Blick darauf, warum DirectCompute benötigt wird:
1) Es ist bequem und effizient. Sie können Berechnungen durchführen und das Ergebnis sofort auf Kanvas ausgeben. Sie müssen die Berechnung über OpenCL an die Grafikkarte senden, dann eine weitere Anfrage für die Ausgabe an Kanvas, und das Senden über die PCIE ist lang.
2) Verschiedene APIs unterscheiden sich stark in ihrer Leistung, je nach Aufgabe und Grafikkartenhersteller. Und die Auswahl wird groß sein.
3) Es besteht die Möglichkeit, die Sprache zu wählen. Wenn man hlsl kennt, muss man opencl nicht lernen.
4) Berechnung und Ausgabe des Ergebnisses kann in einer Sprache geschrieben werden, die bequem ist.
5) Für den Haufen. Vertexe gibt es, Pixel gibt es, sogar geometrische gibt es, aber rechnerische gibt es nicht.
6) Dafür ist fast alles vorbereitet. DX ist aufgeschraubt, müssen nur einen Shader hinzufügen, ist es nicht hinzufügen kuda von Grund auf neu.
7) Ich möchte eine solche Sache für die Ausbildung machen.
8) Und das Wichtigste.
- habr.com
- Roman Shatalov - roman@shatalov.su
- oldshatalov.ghost17.ru
Es gibt OpenCL. Ich habe den Verdacht, dass es viel einfacher sein wird).
Es besteht der Verdacht, dass Sie das Forum ein wenig falsch verstanden haben.
Es besteht der Verdacht, dass Sie das falsche Thema haben.
Minimaler Code, plus ein Versuch, die Leistung mit einem normalen Kanvas zu vergleichen (auf krumme Art und Weise, hat pcie bus score)
#include <Canvas\Canvas.mqh> #resource "/Files/vertex.hlsl" as string VS; #resource "/Files/pixel.hlsl" as string PS; struct VSInputVertex { float position[4]; static const DXVertexLayout s_layout[1]; }; const DXVertexLayout VSInputVertex::s_layout[1]= { {"POSITION", 0, DX_FORMAT_R32G32B32A32_FLOAT } }; void OnStart() { int size=500; CCanvas cc; cc.CreateBitmapLabel("11",100,100,size,size); cc.Erase(ColorToARGB(clrGreen)); cc.Update(); Sleep(1000); VSInputVertex vertex[]; ArrayResize(vertex,size*size); for(int y=0;y<size;y++) {for(int x=0;x<size;x++) {vertex[y*size+x].position[0]=2.f*(x+1)/size-1.f; vertex[y*size+x].position[1]=2.f*(y+1)/size-1.f; vertex[y*size+x].position[2]=0.5; vertex[y*size+x].position[3]=1.0; } } int hc=DXContextCreate(size,size); int hbv=DXBufferCreate(hc,DX_BUFFER_VERTEX,vertex); string s=""; int hsv=DXShaderCreate(hc,DX_SHADER_VERTEX,VS,"main",s); int hsp=DXShaderCreate(hc,DX_SHADER_PIXEL ,PS,"main",s); DXShaderSetLayout(hsv,VSInputVertex::s_layout); DXPrimiveTopologySet(hc,DX_PRIMITIVE_TOPOLOGY_POINTLIST); DXBufferSet(hc,hbv); DXShaderSet(hc,hsv); DXShaderSet(hc,hsp); DXContextClearDepth(hc); DXDraw(hc); uint image[]; ulong t1=GetMicrosecondCount(); DXContextGetColors(hc,image); ulong t2=GetMicrosecondCount(); for(int y=0;y<size;y++) for(int x=0;x<size;x++) cc.PixelSet(x,y,image[y*size+x]); ulong t3=GetMicrosecondCount(); cc.Update(); Print(t2-t1," ",t3-t2); Sleep(1000); DXRelease(hsp); DXRelease(hsv); DXRelease(hbv); DXRelease(hc); cc.Destroy(); }
https://www.mql5.com/ru/forum/227736
Übertragen auf Shader. In den ersten 15 Sekunden wird der Quellcode auf der CPU ausgeführt, danach die Version für die CPU.
"Sie müssen das Array m_pixels[] in der Datei Canvas.mqh von protected: nach public: verschieben".
#include <Canvas\Canvas.mqh> #resource "/Files/vertex.hlsl" as string VS; #resource "/Files/pixel.hlsl" as string PS; struct VSInputVertex {float position[4]; static const DXVertexLayout s_layout[1]; }; const DXVertexLayout VSInputVertex::s_layout[1]={{"POSITION", 0, DX_FORMAT_R32G32B32A32_FLOAT}}; struct PSInputBuffer {float resolution[2]; float time; float dummy; }; void OnStart() {CCanvas C; int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); // получаем Ширину окна int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // создаем канвас размером текущего окна Print("Error creating canvas: ",GetLastError()); //---CPU--- uint i=0,j=100000; int size=Width*Height; uchar h[25600]; for (int w=0;w<25600;w++) h[w]= uchar(128+128*sin(double(w)/256));//создаем массив для ускорения работы double X1=0,Y1=0,X2=0,Y2=0; uint t0=GetTickCount(); uint t1=0; while(!IsStopped()) {int pos=int(i%size); if(pos==0) {C.TextOut(100,100,"CPU FPS: "+DoubleToString(1000./(GetTickCount()-t1),2),clrWhite); t1=GetTickCount(); C.Update(); if(t1-t0>15000) break; //Sleep(30); X1= Width-(sin((double)j/100)*(double)Width); Y1= Height-(cos((double)j/140)*(double)Height); X2= Width+(cos((double)j/80)*(double)Width); Y2= Height+(sin((double)j/20)*(double)Height); j++; } int X=pos%Width; int Y=int(pos/Width); double d= ((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))/(((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))+((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y))); C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]); i++; } //---GPU--- VSInputVertex vertex[]= {{{-1,-1,0.5,1.0}},{{-1,1,0.5,1.0}},{{1,1,0.5,1.0}},{{1,-1,0.5,1.0}}}; int hc=DXContextCreate(Width,Height); int hbv=DXBufferCreate(hc,DX_BUFFER_VERTEX,vertex); uint index[]={0,1,2, 2,3,0}; int hbi=DXBufferCreate(hc,DX_BUFFER_INDEX ,index ); string s=""; int hsv=DXShaderCreate(hc,DX_SHADER_VERTEX,VS,"main",s); int hsp=DXShaderCreate(hc,DX_SHADER_PIXEL ,PS,"main",s); int hi[1]; hi[0]=DXInputCreate(hc,sizeof(PSInputBuffer)); DXShaderInputsSet(hsp,hi); DXShaderSetLayout(hsv,VSInputVertex::s_layout); DXPrimiveTopologySet(hc,DX_PRIMITIVE_TOPOLOGY_TRIANGLELIST); DXBufferSet(hc,hbv); DXBufferSet(hc,hbi); DXShaderSet(hc,hsv); DXShaderSet(hc,hsp); PSInputBuffer frame_data; frame_data.resolution[0]=(float)Width; frame_data.resolution[1]=(float)Height; for(uint n=100000;!IsStopped();n++) {DXContextClearDepth(hc); frame_data.time=(float)n; DXInputSet(hi[0],frame_data); DXDrawIndexed(hc); DXContextGetColors(hc,C.m_pixels); C.TextOut(100,100,"GPU FPS: "+DoubleToString(1000./(GetTickCount()-t1),2),clrWhite); C.Update(); t1=GetTickCount(); } DXRelease(hi[0]); DXRelease(hsp); DXRelease(hsv); DXRelease(hbv); DXRelease(hbi); DXRelease(hc); C.Destroy(); }
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.