Hi guys,
I am working in Visual Studio 2012 and I need to create a computeshader, which is with its 250 lines quite big, so i decided to precreate it with the inbuild HLSL compiler by generating a header file. The compiler didnt complained at all and the binary Array just got created, but if i want to bind the data to a shader object uisng the line:
device->CreateComputeShader(backpropshader, sizeof(backpropshader), NULL, &berechner);
backpropshader being the binary buffer in the header file, the Application raises an acess violation Exception. Does anyone know how this Exception could arise?
I am also concerned about the binary array to be 23 thousand lines long, is that normal?
the Shader is suposed to use the Backpropagation algorithm on several neuronal systems parallely:
This is the Shader reduced to a few lines, I hope its understandable though many of the variablenames are german.
cbuffer konstanten : register(b0)
{
uint systemcount;
uint neuronencount;
uint ausgaenge;
uint eingaenge;
uint vorgabensegment;
uint vorgabencount;
uint aufgabencount;
uint lernschritte;
uint lernstaerke;
};
struct Verbindung
{
uint start;
uint ende;
float gewicht;
};
struct neurondaten
{
float eingabe;
float ausgabe;
uint transfermodus;
float fehler;
};
StructuredBuffer<float> Vorgabentemplate : register(u0);
RWStructuredBuffer<Verbindung> Verbindungen : register(u1);
RWStructuredBuffer<neurondaten> Neurone : register(u2);
void PROPAGATE(uint basisvorgabe, uint basisneuron, uint basisverbindung, uint endverbindung)
{
Neurone[basisneuron].ausgabe = 1.0f; //Biasneuron gleich setzen
for (unsigned int einschreib1 = 1; einschreib1 < eingaenge; einschreib1++)
{
Neurone[basisneuron + einschreib1].ausgabe = Vorgabentemplate[basisvorgabe + einschreib1 - 1];
}
for (unsigned int einschreib2 = 1 + eingaenge; einschreib2 < neuronencount; einschreib2++)
{
Neurone[basisneuron + einschreib2].eingabe = 0;
Neurone[basisneuron + einschreib2].fehler = 0;
}
//Neurone sind im Grundzustand
for (unsigned int i = basisverbindung; i < endverbindung; i++)
{
if (Verbindungen[i].start == Verbindungen[i].ende)
{
switch (Neurone[Verbindungen[i].start].transfermodus)
{
....................
}
}
else
{
Neurone[Verbindungen[i].ende].eingabe += Neurone[Verbindungen[i].start].ausgabe * Verbindungen[i].gewicht;
}
}
}
[numthreads(128, 1, 1)]
void BACKPROPAGATE( uint ID : SV_DispatchThreadID )
{
if (ID < systemcount)
{
float restfehler = 0;
uint basisneuron = neuronencount * ID;
uint basisverbindung = aufgabencount * ID;
uint endbasisverbindung = aufgabencount * (ID + 1);
for (unsigned int durchgang = 0; durchgang < lernschritte; durchgang++)
{
restfehler = 0;
uint basisvorgabe = 0;
for (unsigned int vorgabenzaehler = 0; vorgabenzaehler < vorgabencount; vorgabenzaehler++)
{
PROPAGATE(basisvorgabe,basisneuron,basisverbindung, endbasisverbindung);
for (unsigned int fehlerstart = neuronencount - ausgaenge; fehlerstart < neuronencount; fehlerstart++)
{
Neurone[basisneuron + fehlerstart].fehler = Neurone[basisneuron + fehlerstart].eingabe - Vorgabentemplate[basisvorgabe + eingaenge];
restfehler += Neurone[basisneuron + fehlerstart].fehler * Neurone[basisneuron + fehlerstart].fehler;
}
for (unsigned int i = endbasisverbindung - 1; i-- > basisverbindung;)
{
if (Verbindungen[i].start == Verbindungen[i].ende) //refreshe den fehler
{
switch (Neurone[Verbindungen[i].start].transfermodus)
{
..........
}
}
else
{
Verbindungen[i].gewicht -= lernschritte * Neurone[Verbindungen[i].ende].fehler * Neurone[Verbindungen[i].start].ausgabe;
Neurone[Verbindungen[i].start].fehler += Neurone[Verbindungen[i].ende].fehler * Verbindungen[i].gewicht;
}
}
basisvorgabe += vorgabensegment;
}
}
}
}