Übung 10: Musterlösung bestätigen?

ddinter
Erstie
Erstie
Beiträge: 15
Registriert: 14. Dez 2011 23:12

Übung 10: Musterlösung bestätigen?

Beitrag von ddinter »

Hallo,

ich habe mal die 10. Übung (Matrizenmultiplikation) selbst implementiert und bei dem Vergleich (zwischen der Lösung der sequentiellen Berechnung und der Berechnung mit OpenMP) auch einen Vergleich zwischen der Musterlösung und meiner Lösung gezogen. Dazu habe ich einfach via Copy&Paste die sequentielle Berechnung sowie get- und set-Methoden aus dem Lösungsblatt kopiert. Allerdings weicht meine Berechnung ab.

Habe meinen Algorithmus nun 3-4 mal auf dem Blatt mit einem Beispiel durchgerechnet. Zur Validierung habe ich die Berechnung auf die Rechnung http://www.wolframalpha.com/input/?i=%7 ... 2C4%7D+%7D runtergebrochen und habe mir die Lösung auch als eine Zeile auf dem Terminal ausgeben lassen. Ich erhalte so die korrekte Lösung 7 10 15 22, jedoch gibt mir die Methode aus der Musterlösung die Lösung 7 10 22 32 aus, was offensichtlich nicht korrekt sein kann.

Hat irgendjemand die Musterlösung schon einmal mit seiner Lösung verglichen und kann sie bestätigen oder ebenfalls ablehnen?

Vielen Dank.

ddinter
Erstie
Erstie
Beiträge: 15
Registriert: 14. Dez 2011 23:12

Re: Übung 10: Musterlösung bestätigen?

Beitrag von ddinter »

Folgendes ist mir beim Bearbeiten der Übung 11 aufgefallen:

Habe die Musterlösung der 10. Übung in die uebung11.cpp eingefügt und entsprechend für float-Werte angepasst:

Code: Alles auswählen

template<typename T> T getMatrixElement(T* matrix, int matrixWidth, int x, int y){
        return matrix[y * matrixWidth + x];
}

template<typename T> void setMatrixElement(T* matrix, int matrixWidth, int x, int y, T& val){
        matrix[y * matrixWidth + x] = val;
}

void MultiplyMatrices(float* A, int aWidth, int aHeight, float* B, int bWidth, float* Result){
        int x, y, i;
        float sum;
        for(x = 0; x < bWidth; x++)
                for(y = 0, sum = 0.0f; y < aHeight; y++){
                        for(i = 0; i < aWidth; i++)
                                sum += getMatrixElement(A, aWidth, i, y) * getMatrixElement(B, bWidth, x, i);
                        setMatrixElement(Result, bWidth, x, y, sum);
                }
}
Zusätzlich habe ich meine Lösung der Übung 10 eingefügt:

Code: Alles auswählen

void multiplyCPU(float* A, int widthA, int heightA, float* B, int widthB, int heightB, float* C)
{
        float value;
        for( int i = 0; i < heightA; i++) {
                for( int k = 0; k < widthB; k++) {
                        unsigned int pos = i * widthB + k;
                        value = 0.0f;
                        for( int n = 0; n < widthA; n++) {
                                value += A[i*widthA+n] * B[n*widthB+k];
                        }
                        C[pos] = value;
                }
        }
}
Jetzt habe ich meine Lösung mit meiner Lösung der 11. Übung (entspricht genau der Musterlösung), verglichen:

Code: Alles auswählen

        float const epsilon = 0.0001f;
        bool resultCorrect = true;
        for(int i = 0; i < sizeC; i++) {
                float absDiff = fabs(hC[i] - hCcpu[i]);
                if(absDiff > epsilon) {
                        resultCorrect = false;
                        break;
                }
        }
Und dann eben wenn resultCorrect == false ist, einen Fehler ausgegeben. Läuft ohne Probleme.
Danach vergleiche ich die Musterlösung der Aufgabe 10 mit dem oCL-Implementation:

Code: Alles auswählen

                float* hCsol = new float[sizeC];
                MultiplyMatrices(hDataA, widthA, heightA, hDataB, widthB, hCsol);
                for(int i = 0; i < sizeC; i++) {
                        float absDiff = fabs(hC[i] - hCsol[i]);
                        if(absDiff > epsilon) {
                                std::cout << "Musterloesung 10 ist falsch" << std::endl;
                                return 1;
                        }
                }
Und siehe da, das Programm gibt die Meldung "Musterloesung 10 ist falsch" aus. Das lässt mich als zu der Annahme kommen, dass die Musterlösung zur 10. Übung falsch sein muss. (habe v1.0.1)

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Übung 10: Musterlösung bestätigen?

Beitrag von mw1039 »

Ich hab die Musterloesung jetzt korrigiert. Der innere Schleifenkopf lautet jetzt

Code: Alles auswählen

for(y = 0; y < aHeight; y++, sum = 0){
Vielen Dank fuer deine Hilfe!

Antworten

Zurück zu „Archiv“