Faice
Mitglied
Thread Starter
- Dabei seit
- 29.06.2004
- Beiträge
- 142
- Reaktionspunkte
- 1
Hallo,
Ich habe da mal ein echt komisches Problem, wo ich mir nicht erklaeren kann, was der Fehler ist. Also ich versuche mich gerade ein wenig an Altivec und Matrixmultiplikation. Und dabei habe ich irgendwie ein Problem.
Beim Erzeugen von Matrizen mit Werten spinnt mein Programm etwas rum. Bei 12x12 und 16x16 Matrizen beispielsweise fuellt es die erste Matrix teilweise mit komischen Werten. Aber immer nur die erste. Bei 8x8 oder 32x32 MAtrizen tritt das Problem nicht auf.
Hier mal der Code:
Die Ausgabe sieht dann so aus:
Und nun das beste, wenn man im Quelltext die beiden printfs vor der Speicherallokation nicht mit ins Programm rein nimmt, dann funktioniert alles. Bitte testet das mal auf euren Systemen, und sagt mir dann, dass es sich bei euch auch so komisch verhaelt. Oder sagt mir, woran der Fehler liegt und wie man ihn abstellt.
MfG
Faice
P.S. Beim Compilieren in der Kommadozeile den Schalter -maltivec nicht vergessen, oder in XCode bei Edit Active Target unter Build bei Code Generation Auto-vectorization anstellen.
Ich habe da mal ein echt komisches Problem, wo ich mir nicht erklaeren kann, was der Fehler ist. Also ich versuche mich gerade ein wenig an Altivec und Matrixmultiplikation. Und dabei habe ich irgendwie ein Problem.
Beim Erzeugen von Matrizen mit Werten spinnt mein Programm etwas rum. Bei 12x12 und 16x16 Matrizen beispielsweise fuellt es die erste Matrix teilweise mit komischen Werten. Aber immer nur die erste. Bei 8x8 oder 32x32 MAtrizen tritt das Problem nicht auf.
Hier mal der Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <altivec.h>
#define ZEILEN 12
#define SPALTEN 12
#define RANGE 99
typedef float *matrix;
typedef vector float *vmatrix;
void rand_matrix(matrix mtx, int mitwert);
void ausgabe(matrix mtx);
typedef union
{
matrix mat; // Matrix als normales Array von Werten
vmatrix vmat; // Matrix mit Vectoren
}matTovMat;
int main (int argc, const char * argv[])
{
matTovMat mtx1, mtx2;
//printf("Martix1-Adr.: %#x\n", mtx1);
//printf("Martix2-Adr.: %#x\n", mtx2);
if((mtx1.mat = (matrix)malloc(ZEILEN * (SPALTEN / 4) * sizeof(matrix))) == NULL)
{
puts("Fehler bei der Speicherallokation");
exit(-1);
}
if((mtx2.mat = (matrix)malloc(ZEILEN * SPALTEN * sizeof(matrix))) == NULL)
{
puts("Fehler bei der Speicherallokation");
free(mtx1.mat);
exit(-1);
}
// Fuellen der Matrizen mit Zufallswerten
rand_matrix(mtx1.mat, 1);
rand_matrix(mtx2.mat, 1);
// Ausgabe der Matrizen
ausgabe(mtx1.mat);
ausgabe(mtx2.mat);
free(mtx1.mat);
free(mtx2.mat);
return 0;
}
// Ausgabe einer Matrix auf den Bildschirm
void ausgabe(matrix mtx)
{
int i, j;
for(i = 0; i < ZEILEN; i++)
{
printf("|");
for(j = 0; j < SPALTEN; j++)
{
printf("%9.2f", mtx[i * SPALTEN + j]);
}
printf(" |\n");
}
puts(" * * * * ENDE * * * *");
puts("\n");
}
void rand_matrix(matrix mtx, int mitwert)
{
int i, j;
float x;
srand((unsigned)time(0));
if(mitwert == 0)
{
for(i = 0; i < ZEILEN; i++)
{
for(j = 0; j < SPALTEN; j++)
{
mtx[i * SPALTEN + j] = 0;
}
}
}
else
{
for(i = 0; i < ZEILEN; i++)
{
for(j = 0; j < SPALTEN; j++)
{
//mtx[i][j] = myrandom();
x = (rand() % (RANGE + 1));
mtx[i * SPALTEN + j] = x;
}
}
}
}
Die Ausgabe sieht dann so aus:
Code:
[Session started at 2005-11-09 23:27:18 +0100.]
| 34.00 21.00 90.00 0.00 29.00 65.00 38.00 23.00 50.00 50.00 82.00 82.00 |
| 73.00 28.00 92.00 80.00 98.00 30.00 88.00 16.00 84.00 57.00 94.00 7.00 |
| 80.00 22.00 91.00 29.00 71.00 19.00 16.00 72.00 80.00 50.00 29.00 20.00 |
| 0.00 0.00 -0.00 -0.00 -0.00 -0.00 -0.00 -0.00 -0.00 -0.00 -0.00 -0.00 |
|339615136492207134461438014706212143104.00339615136492207134461438014706212143104.00339615136492207134461438014706212143104.00338953138925153547590470800371487866880.00 37.00 41.00 46.00 92.00 31.00 26.00 62.00 43.00 |
| 50.00 50.00 15.00 40.00 84.00 66.00 28.00 45.00 32.00 85.00 21.00 4.00 |
| 42.00 11.00 19.00 14.00 89.00 3.00 96.00 51.00 44.00 34.00 43.00 1.00 |
| 8.00 36.00 80.00 14.00 49.00 66.00 94.00 68.00 76.00 99.00 52.00 13.00 |
| 96.00 12.00 12.00 52.00 60.00 57.00 69.00 6.00 13.00 88.00 29.00 63.00 |
| 90.00 79.00 29.00 80.00 60.00 31.00 35.00 46.00 12.00 0.00 37.00 83.00 |
| 63.00 10.00 94.00 98.00 95.00 6.00 21.00 18.00 71.00 84.00 53.00 56.00 |
| 6.00 35.00 91.00 68.00 91.00 85.00 24.00 72.00 90.00 88.00 91.00 33.00 |
* * * * ENDE * * * *
| 34.00 21.00 90.00 0.00 29.00 65.00 38.00 23.00 50.00 50.00 82.00 82.00 |
| 73.00 28.00 92.00 80.00 98.00 30.00 88.00 16.00 84.00 57.00 94.00 7.00 |
| 80.00 22.00 91.00 29.00 71.00 19.00 16.00 72.00 80.00 50.00 29.00 20.00 |
| 16.00 37.00 47.00 27.00 51.00 5.00 29.00 92.00 88.00 95.00 82.00 45.00 |
| 57.00 86.00 68.00 69.00 37.00 41.00 46.00 92.00 31.00 26.00 62.00 43.00 |
| 50.00 50.00 15.00 40.00 84.00 66.00 28.00 45.00 32.00 85.00 21.00 4.00 |
| 42.00 11.00 19.00 14.00 89.00 3.00 96.00 51.00 44.00 34.00 43.00 1.00 |
| 8.00 36.00 80.00 14.00 49.00 66.00 94.00 68.00 76.00 99.00 52.00 13.00 |
| 96.00 12.00 12.00 52.00 60.00 57.00 69.00 6.00 13.00 88.00 29.00 63.00 |
| 90.00 79.00 29.00 80.00 60.00 31.00 35.00 46.00 12.00 0.00 37.00 83.00 |
| 63.00 10.00 94.00 98.00 95.00 6.00 21.00 18.00 71.00 84.00 53.00 56.00 |
| 6.00 35.00 91.00 68.00 91.00 85.00 24.00 72.00 90.00 88.00 91.00 33.00 |
* * * * ENDE * * * *
Und nun das beste, wenn man im Quelltext die beiden printfs vor der Speicherallokation nicht mit ins Programm rein nimmt, dann funktioniert alles. Bitte testet das mal auf euren Systemen, und sagt mir dann, dass es sich bei euch auch so komisch verhaelt. Oder sagt mir, woran der Fehler liegt und wie man ihn abstellt.
MfG
Faice
P.S. Beim Compilieren in der Kommadozeile den Schalter -maltivec nicht vergessen, oder in XCode bei Edit Active Target unter Build bei Code Generation Auto-vectorization anstellen.