Originariamente inviato da AntonioG Lavoro eccezionale ... continua così ... Ti ringrazio Antonio, il tuo apprezzamento è per me motivo di grande soddisfazione.
Lavoro eccezionale ... continua così ...
In effetti, le partizioni (e le composizioni) sono un po' ovunque e spuntano fuori là dove meno ce le attendiamo: econometria, fisica, meccanica, chimica, teoria dei sistemi... oltre, ovviamente, alla "specialità della casa", ossia la matematica discreta. Basti pensare al loro ruolo fondamentale nei gruppi di permutazioni, a loro volta essenziali in molte teorie fisiche avanzate. Non a caso, uno dei pochissimi commenti a caldo in lingua italiana (al di là delle solite traduzioni di articoli sulle edizioni italiane di riviste straniere, pressoché dovute) all'annuncio dei risultati del gruppo di Ken Ono proveniva da un paio di fisici, che si occupano prevalentemente di teoria delle stringhe! Anche per questo le formule di cui abbiamo più volte discusso (e i relativi algoritmi) ricoprono un ruolo fondamentale...
Davvero molto interessante, come già avevo commentato nel thread che hai linkato. Pare, però, che le partizioni di interi ti perseguitino
Originariamente inviato da AntonioG Bei tempi ... Ottimo lavoro, Antonio... e sì, quelli erano davvero bei tempi!
Questo il codice preparato in un file Blog.s65 come sorgente per il mio Assembler ... ;************************************** ; Codice "universale" per startup BASIC ;************************************** .ORG $0801 ;-------------------------------------- .DW BASEND ; Indirizzo della prossima linea .DW 1996 ; Numero di linea -> anno di stesura... .DB $9E ; Token per "SYS" .ASCII "2105:" ; Indirizzo di avvio .DB $8F,$22 ; Token per "REM" + '"' ; Rendo illeggibile il listing con una serie di DEL ($14) .DB 20,20,20,20,20,20,20,20,20,20,20,20 ; Solo la stringa seguente apparira' nel listato: .ASCIZ "(C) CASA MIA SOFTWAREHOUSE***" BASEND .DW 0 ; Terminatore di programma ;-------------------------------------- ;************************************** ;** Qui inizia il nostro sorgente ** ;************************************** .END e questo il risultato nel file Blog.l65 (naturalmente oltre al file binario Blog.b65) D64ASM - Development Assembler for C64 Version 1 revision 47 (C) Antonio G, 2011 Line # Addr Value Label Line 00000001 0000 ;************************************** 00000002 0000 ; Codice "universale" per startup BASIC 00000003 0000 ;************************************** 00000004 0000 00000005 0000 *=0801 .ORG $0801 00000006 0801 00000007 0801 ;-------------------------------------- 00000008 0801 37 08 .DW BASEND ; Indirizzo della prossima linea 00000009 0803 CC 07 .DW 1996 ; Numero di linea -> anno di stesura... 00000010 0805 9E .DB $9E ; Token per "SYS" 00000011 0806 32 31 30 35 .ASCII "2105:" ; Indirizzo di avvio 3A 00000012 080B 8F 22 .DB $8F,$22 ; Token per "REM" + '"' 00000013 080D ; Rendo illeggibile il listing con una serie di DEL ($14) 00000014 080D 14 14 14 14 .DB 20,20,20,20,20,20,20,20,20,20,20,20 14 14 14 14 14 14 14 14 00000015 0819 ; Solo la stringa seguente apparira' nel listato: 00000016 0819 28 43 29 20 .ASCIZ "(C) CASA MIA SOFTWAREHOUSE***" 43 41 53 41 20 4D 49 41 20 53 4F 46 54 57 41 52 45 48 4F 55 53 45 2A 2A 2A 00 00000017 0837 00 00 BASEND .DW 0 ; Terminatore di programma 00000018 0839 ;-------------------------------------- 00000019 0839 ;************************************** 00000020 0839 ;** Qui inizia il nostro sorgente ** 00000021 0839 ;************************************** 00000022 0839 00000023 0839 .END 00000024 0839 >End of current source< Errors : 00000 Bei tempi ...
;************************************** ; Codice "universale" per startup BASIC ;************************************** .ORG $0801 ;-------------------------------------- .DW BASEND ; Indirizzo della prossima linea .DW 1996 ; Numero di linea -> anno di stesura... .DB $9E ; Token per "SYS" .ASCII "2105:" ; Indirizzo di avvio .DB $8F,$22 ; Token per "REM" + '"' ; Rendo illeggibile il listing con una serie di DEL ($14) .DB 20,20,20,20,20,20,20,20,20,20,20,20 ; Solo la stringa seguente apparira' nel listato: .ASCIZ "(C) CASA MIA SOFTWAREHOUSE***" BASEND .DW 0 ; Terminatore di programma ;-------------------------------------- ;************************************** ;** Qui inizia il nostro sorgente ** ;************************************** .END
D64ASM - Development Assembler for C64 Version 1 revision 47 (C) Antonio G, 2011 Line # Addr Value Label Line 00000001 0000 ;************************************** 00000002 0000 ; Codice "universale" per startup BASIC 00000003 0000 ;************************************** 00000004 0000 00000005 0000 *=0801 .ORG $0801 00000006 0801 00000007 0801 ;-------------------------------------- 00000008 0801 37 08 .DW BASEND ; Indirizzo della prossima linea 00000009 0803 CC 07 .DW 1996 ; Numero di linea -> anno di stesura... 00000010 0805 9E .DB $9E ; Token per "SYS" 00000011 0806 32 31 30 35 .ASCII "2105:" ; Indirizzo di avvio 3A 00000012 080B 8F 22 .DB $8F,$22 ; Token per "REM" + '"' 00000013 080D ; Rendo illeggibile il listing con una serie di DEL ($14) 00000014 080D 14 14 14 14 .DB 20,20,20,20,20,20,20,20,20,20,20,20 14 14 14 14 14 14 14 14 00000015 0819 ; Solo la stringa seguente apparira' nel listato: 00000016 0819 28 43 29 20 .ASCIZ "(C) CASA MIA SOFTWAREHOUSE***" 43 41 53 41 20 4D 49 41 20 53 4F 46 54 57 41 52 45 48 4F 55 53 45 2A 2A 2A 00 00000017 0837 00 00 BASEND .DW 0 ; Terminatore di programma 00000018 0839 ;-------------------------------------- 00000019 0839 ;************************************** 00000020 0839 ;** Qui inizia il nostro sorgente ** 00000021 0839 ;************************************** 00000022 0839 00000023 0839 .END 00000024 0839 >End of current source< Errors : 00000
Portando all'estremo il concetto, alcune tra le numerose varianti di VP sono organizzate in modo tale che sorgente e destinazione dati siano unicamente in memoria (si ricordi, tuttavia, che quasi sempre si parla di memorie on-chip in casi del genere). Motivi secondari di efficienza e ottimizzazione della implementazione conducono tuttavia quasi ogni progetto di VP concretamente realizzato a fare affidamento su uno o più banchi di registri, ciascuno con molteplicità pari al lanes factor: e ciò non si limita unicamente a codesti registri, che comunque hanno un ruolo primario nella modalità di accesso sequenziale sancita dalla teoria. Infatti, pensando proprio al semplice esempio al centro della presente entry, è altresì facile intuire l'opportunità di disporre anche di registri e/o accumulatori per risultati scalari (intermedi e finali).
Operazioni di fetch e decode su una medesima istruzione in rapporto con la quantità di dati da elaborare sono drasticamente ridotte in VP, e in concomitanza con dati richiesti localmente "vicini" tra loro acceduti vettorialmente implica una totale inutilità della cache. Perfetto ora mi è tutto più chiaro. Grazie
Dobbiamo ricordare che l'architettura vettoriale è la più tipica soluzione per il progetto e la realizzazione di supercalcolatori, a partire dai Cray. Dunque possiamo attenderci qualche "sorpresa" hardware rispetto all'architettura "povera" dei PC e server mainstream. Per non appesantire la presente risposta, mi limiterò solo ad accennare i concetti più intuitivi che conducono all'eliminazione della cache. In effetti, abbiamo già indicato due concetti estremamente importanti in un vector processor: l'operabilità strettamente vincolata a posizioni corrispondenti nei vettori-operando, che ovviamente implica la garanzia di nessuna interazione o dipendenza tra i dati di un medesimo vettore (a questo provvedono i layer software, sia a tempo di compilazione che a runtime); e il rapporto tra lanes e lunghezza del vettore-operando, che sovente comporta l'esecuzione iterativa di una medesima operazione su più dati memorizzati in locazioni strettamente sequenziali. Dunque, anche se non abbiamo ben presenti in mente architetture esotiche come quella dello Stardent Titan, con i suoi banchi di registri multipli (es. 8 registri da 64 lanes cadauno) e la memoria interleaved tipica dei supercalcolatori, possiamo però già intuire che un VP non ha alcun bisogno di effettuare un pipeline profondo delle istruzioni, ma solo dei dati. Questo approccio è mutuamente esclusivo col concetto stesso di data cache, naturalmente. In base a tali considerazioni, anche se effettivamente esistono schemi di caching per talune architetture di VP (queste sì davvero esotiche), l'approccio generale - condiviso anche da taluni processori ibridi scalari/vettoriali, o comunque capaci di emulare modalità vettoriali - è quello di usare per costruzione il bypass della cache, grazie a banchi di registri dedicati - una soluzione ampiamente in uso anche all'altro estremo del computing applicativo, ossia nei sistemi embedded.
Salve, veramente interessante articolo. Sarei grato se mi dasse delucidazioni di come l'accesso vettoriale alla memoria sia capace di rendere inutile tecniche come l'uso della cache. Grazie.
Ciao Daniele, ottimo blog! Come sempre Oltre ai riferimenti indicati, vorrei aggiungerne altri:La documentazione ufficiale del linguaggio che è liberamente scaricabile dal sito di riferimento Python Doc; Django, per lo sviluppo di applicazioni web; Ancora, riguardo GUI Programming in Python, la mia scelta personale è caduta su wxPython (libreria grafica multi-piattaforma, compatibile con GNU/Linux, Microsoft Windows e Mac OSX).
Il principale problema di APL, paradossalmente, consisteva nell'essere eccessivamente in anticipo sui tempi: i suoi operatori erano infatti simboli non convenzionali tratti direttamente dal formalismo matematico, quindi non presenti sulle tastiere e sui device di output (siamo negli anni Sessanta !). A dire il vero, mi hai fatto tornare in mente che i terminali IBM 3270 avevano talvolta QUESTA favolosa tastiera.
Che dire, post perfetto (titolo superbo). La nota dolente rimane l'osservanza del decalogo da parte del Developer, Project Leader ecc.