Nu har jag kompilerat klart CLapack. Jag använde mig av standard Blas.
Jag fick fram en fil. Nu ska man bara komma på ett bra sätt och länka denna .a fil.
Ingen som vet?
Edit: Nu har jag fått det att fungera.
GNU Octave
Kod: Markera allt
>> B = rand(15,15)
B =
0.84245 0.23405 0.69751 0.27905 0.18851 0.61018 0.62182 0.71839 0.79161 0.56156 0.83395 0.092388 0.8511 0.44826 0.82158
0.84614 0.15947 0.096336 0.80793 0.35114 0.42583 0.2134 0.75324 0.31391 0.22892 0.94773 0.81204 0.62554 0.28367 0.26637
0.26509 0.91429 0.14222 0.28321 0.11607 0.41188 0.10071 0.18224 0.75723 0.89125 0.62494 0.83016 0.46448 0.73119 0.10982
0.45197 0.44562 0.27909 0.76019 0.014571 0.42705 0.70214 0.64936 0.98451 0.59632 0.07654 0.95633 0.18574 0.92716 0.65401
0.48034 0.38327 0.32906 0.34794 0.68673 0.54113 0.34142 0.48561 0.37221 0.16097 0.15569 0.63287 0.17518 0.055447 0.44536
0.54119 0.34478 0.53297 0.2796 0.95212 0.5353 0.8202 0.32707 0.0062771 0.64993 0.057361 0.59959 0.16867 0.67892 0.52882
0.082573 0.96676 0.080315 0.48813 0.33496 0.4436 0.01436 0.89664 0.49167 0.37092 0.31586 0.54683 0.65159 0.38531 0.20697
0.35775 0.42437 0.79392 0.49724 0.01319 0.0074932 0.66462 0.6506 0.9889 0.27213 0.99607 0.68418 0.70238 0.81493 0.46062
0.22609 0.59924 0.74631 0.81566 0.92784 0.47376 0.83531 0.47031 0.97093 0.44778 0.42997 0.71882 0.36504 0.34216 0.95187
0.87475 0.22003 0.71901 0.90968 0.27265 0.16106 0.21283 0.14918 0.16776 0.83038 0.43605 0.85075 0.54771 0.77479 0.24739
0.21203 0.65616 0.63534 0.57569 0.22113 0.48063 0.24207 0.54873 0.25042 0.82671 0.88986 0.41674 0.95235 0.89875 0.15004
0.86164 0.89058 0.66423 0.60958 0.47708 0.18674 0.66359 0.92383 0.48073 0.79466 0.64519 0.69876 0.0066587 0.55114 0.10979
0.35586 0.94772 0.28888 0.63119 0.42774 0.82597 0.90274 0.40152 0.96414 0.84376 0.028355 0.040771 0.85359 0.92875 0.32352
0.39274 0.27788 0.41549 0.90884 0.042767 0.64168 0.086933 0.47941 0.91491 0.26425 0.11667 0.49996 0.12644 0.87136 0.30768
0.86527 0.92393 0.47957 0.32175 0.87965 0.13719 0.4014 0.25277 0.83936 0.73476 0.97174 0.65243 0.85813 0.62705 0.0013063
>> tic; [u,s,v] = svd(B); toc
Elapsed time is 0.000423908 seconds.
>> s
s =
Diagonal Matrix
7.8389 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1.7935 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1.6371 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1.5177 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1.4298 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1.2674 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1.1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0.90737 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0.84691 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0.67887 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0.56789 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0.46979 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0.39255 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0.19035 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.043839
>>
Nu är det Clapack!
Kod: Markera allt
/*
============================================================================
Name : BlasTest.c
Author :
Version :
Copyright : MIT
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "blaswrap.h"
#include "f2c.h"
#include "clapack.h"
#define SIZE 15
void MAIN_(){}
void MAIN__(){}
void _MAIN_(){}
int main( )
{
clock_t start, end;
float cpu_time_used;
start = clock();
char JOBU;
char JOBVT;
int i;
integer M = SIZE;
integer N = SIZE;
integer LDA = M;
integer LDU = M;
integer LDVT = N;
integer LWORK;
integer INFO;
integer mn = min( M, N );
integer MN = max( M, N );
double a[SIZE*SIZE] = {
0.84245, 0.23405 , 0.69751 , 0.27905 , 0.18851 , 0.61018 , 0.62182 , 0.71839 , 0.79161 ,0.56156 , 0.83395 , 0.092388 , 0.8511 , 0.44826 , 0.82158,
0.84614 , 0.15947 , 0.096336 , 0.80793 , 0.35114 , 0.42583 , 0.2134 , 0.75324 , 0.31391 , 0.22892 , 0.94773 , 0.81204 , 0.62554 , 0.28367 , 0.26637,
0.26509 , 0.91429 , 0.14222 , 0.28321 , 0.11607 , 0.41188 , 0.10071 , 0.18224 , 0.75723 , 0.89125 , 0.62494 , 0.83016 , 0.46448 , 0.73119 , 0.10982,
0.45197 , 0.44562 , 0.27909 , 0.76019 , 0.014571 , 0.42705 , 0.70214 , 0.64936 , 0.98451 , 0.59632 , 0.07654 , 0.95633 , 0.18574 , 0.92716 , 0.65401,
0.48034 , 0.38327 , 0.32906 , 0.34794 , 0.68673 , 0.54113 , 0.34142 , 0.48561 , 0.37221 , 0.16097 , 0.15569 , 0.63287 , 0.17518 , 0.055447 , 0.44536,
0.54119 , 0.34478 , 0.53297 , 0.2796 , 0.95212 , 0.5353 , 0.8202 , 0.32707 , 0.0062771 , 0.64993 , 0.057361 , 0.59959 , 0.16867 , 0.67892 , 0.52882,
0.082573 , 0.96676 , 0.080315 , 0.48813 , 0.33496 , 0.4436 , 0.01436 , 0.89664 , 0.49167 , 0.37092 , 0.31586 , 0.54683 , 0.65159 , 0.38531 , 0.20697,
0.35775 , 0.42437 , 0.79392 , 0.49724 , 0.01319 , 0.0074932 , 0.66462 , 0.6506 , 0.9889 , 0.27213 , 0.99607 , 0.68418 , 0.70238 , 0.81493 , 0.46062,
0.22609 , 0.59924 , 0.74631 , 0.81566 , 0.92784 , 0.47376 , 0.83531 , 0.47031 , 0.97093 , 0.44778 , 0.42997 , 0.71882 , 0.36504 , 0.34216 , 0.95187,
0.87475 , 0.22003 , 0.71901 , 0.90968 , 0.27265 , 0.16106 , 0.21283 , 0.14918 , 0.16776 , 0.83038 , 0.43605 , 0.85075 , 0.54771 , 0.77479 , 0.24739,
0.21203 , 0.65616 , 0.63534 , 0.57569 , 0.22113 , 0.48063 , 0.24207 , 0.54873 , 0.25042 , 0.82671 , 0.88986 , 0.41674 , 0.95235 , 0.89875 , 0.15004,
0.86164 , 0.89058 , 0.66423 , 0.60958 , 0.47708 , 0.18674 , 0.66359 , 0.92383 , 0.48073 , 0.79466 , 0.64519 , 0.69876 , 0.0066587 , 0.55114 , 0.10979,
0.35586 , 0.94772 , 0.28888 , 0.63119 , 0.42774 , 0.82597 , 0.90274 , 0.40152 , 0.96414 , 0.84376 , 0.028355 , 0.040771 , 0.85359 , 0.92875 , 0.32352,
0.39274 , 0.27788 , 0.41549 , 0.90884 , 0.042767 , 0.64168 , 0.086933 , 0.47941 , 0.91491 , 0.26425 , 0.11667 , 0.49996 , 0.12644 , 0.87136 , 0.30768,
0.86527 , 0.92393 , 0.47957 , 0.32175 , 0.87965 , 0.13719 , 0.4014 , 0.25277 , 0.83936 , 0.73476 , 0.97174 , 0.65243 , 0.85813 , 0.62705 , 0.0013063};
double s[SIZE];
double wk[201];
double uu[SIZE*SIZE];
double vt[SIZE*SIZE];
JOBU = 'A';
JOBVT = 'A';
LWORK = 201;
dgesvd_( &JOBU, &JOBVT, &M, &N, a, &LDA, s, uu,
&LDU, vt, &LDVT, wk, &LWORK, &INFO);
printf("\n INFO=%d", INFO );
for ( i= 0; i< SIZE; i++ ) {
printf("\n s[ %d ] = %f", i, s[ i ] );
}
end = clock();
cpu_time_used = ((float) (end - start)) / CLOCKS_PER_SEC;
printf("\nTotal speed was %f,", cpu_time_used);
return 0;
}
Ja! Helt nöjd, trots att GNU Octave var snabbare med 0.000009092 sekunder, men knappt märkbart. Nu mätte jag över hela C-koden till skillnad från GNU Octave där jag bara mätte över SVD-funktionen. Så vi kan säga att C vann slaget!
INFO=0
s[ 0 ] = 7.838945
s[ 1 ] = 1.793532
s[ 2 ] = 1.637058
s[ 3 ] = 1.517732
s[ 4 ] = 1.429764
s[ 5 ] = 1.267348
s[ 6 ] = 1.099945
s[ 7 ] = 0.907375
s[ 8 ] = 0.846915
s[ 9 ] = 0.678870
s[ 10 ] = 0.567895
s[ 11 ] = 0.469790
s[ 12 ] = 0.392545
s[ 13 ] = 0.190355
s[ 14 ] = 0.043838
Total speed was 0.000433,

Jag använder versionen av BLAS som är den "generella" versionen, dvs ej anpassad efter någon specifik CPU. Denna BLAS version finns inkluderad i Clapack.
Då har jag vissa steg att göra:
1. Lär mig biblioteket. Det verkar vara rätt röriga funktioner.
2. Få kompilatorn att tolka double som float
3. Skriv till STM32