Microsoft Excel e GPU

Anonimo
2020-04-29T15:59:22+00:00

Ho il seguente problema:

utilizzo Excel programmato in VBA per eseguire una serie di calcoli che vengono effettuati su più cartelle, ciascuna delle quali ha una dimensione di circa 35000 Kb, esse prendono i dati da elaborare (circa 60000 per ciascuna cartella) e forniscono un risultato che viene trasferito in una cartella che alla fine estrapola un unico risultato che si presenta come un foglio dove vengono esplicitate le istruzioni che devono essere eseguite nel corso delle 4 ore successive.

Per far tutto ciò Excel impiega circa 25 minuti con un PC con una CPU speed max di 3.30 GHz.

Per accelerare il tutto pensavo di passare ad un PC che fosse in grado di effettuare il GPU computing impiegando, oltre la CPU (ad esempio una Intel i9), una o più schede grafiche (ad esempio le Nvidia GForce), ma ho i seguenti dubbi:

  1. Excel ne può beneficiare?
  2. che tipologia di PC dovrei usare?
  3. saranno necessari anche altri programmi o Windows 10 è sufficiente?

Se qualcuno mi può aiutare gli sarei infinitamen te grato

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2020-05-01T10:36:57+00:00

Quando si lavora con più file in excel per velocizzare sono fondamentali alcune operazioni:

  1. Application.ScreenUpdating = False
  2. il ricalcolo va fatto manualmente

Application.Calculation = xlCalculationManual

ActiveSheet.Calculate quando serve

2bis) se il ricalcolo non serve di tutto il foglio ma solo di alcune celle, non va proprio fatto, soprattutto se il foglio contiene parecchi calcoli da fare, piuttosto quei calcoli vanno fatti all'interno di vba.

  1. Creare un tipo di dato congruo ai dati con cui lavori per il punto 4
  2. Non aprire mai più di quel che serve un foglio, se sono 50 fogli, devono essere aperti 50 volte e basta, se vi e' necessita di quei dati, vanno salvati in memoria mediante il tipo di dato congruo.
  3. Se stai aprendo più volte gli stessi file stai sbagliando, se stai tenendo aperto il file per rileggere più volte le stesse celle da esso, stai sbagliando. Seguendo il punto 4, non lasciare i file aperti se non servono, rallentano il processo. Salvare i dati necessari in memoria tramite il punto 3.

6 avanzato) Cache, se i dati letti non vengono modificati spesso, vanno messi in cache, si deve ripensare alle funzioni, la cache può essere generata anche da un singolo file che contiene tutti quelli che non vengono modificati.

Inoltre quell'application.wait va eliminato, in qualche modo, soprattutto se viene richiamato più di una volta. Di nuovo, non vedendo il codice non posso aiutarti.

Per quanto riguarda CUDA: VBA non usa CUDA, CUDA e' usato in C++, Excel e' scritto in C++ e utilizza l'accelerazione hardware per mostrare a video forme, disegni etc.

VBA usa la CPU.

La GPU non e' più veloce della CPU e non ha l'accesso diretto alla ram.

La GPU ha solo più core e più fare più cose contemporaneamente, ma VBA non supporta il multi-thread.

La GPU e' specifica più per lavori ripetitivi piuttosto che calcoli matematici complessi.

Ovvio se compri un i9 9900k con un ssd NVME M.2 velocizzerai l'esecuzione, ma non aspettarti di portarla a pochi secondi o di avere grandi miglioramenti, la spesa vale la resa? O e' meglio rivedere il codice?

Spero di esserti stato utile, un saluto.

La risposta è stata utile?

3 persone hanno trovato utile questa risposta.
0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2020-04-30T15:40:25+00:00

    Application.Wait Now + TimeValue("00:00:10")

    Questo a cosa serve? Chi te le ha scritte queste funzioni?

    Prima di avviare la funzione principale è stato disattivato il refresh dello schermo e dei calcoli?

    Quanti sono in totale questi file di Excel presenti nelle varie cartelle?

    Ritornando alla domanda iniziale, ovvero L ’acquisto del nuovo pc, no, non credo possa apportare molti miglioramenti, si deve rivedere un po’ il codice come avevo immaginato.

    E difficile capire in questo modo, se vuoi e hai modo di fare una copia di questi file, rimuovendone i dati sensibili e caricarli in un archivio condividendolo tramite un sito di upload o onedrive, ci di un occhiata più approfondita a come e’ stato scritto il codice e ti posso poi dare una conferma di quanto detto del PC.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2020-04-30T14:45:49+00:00

    Ciascuna di quelle Application.Run "RicProg001.xlsm!Cell_2_3" ecc. richiama dei file che sono elencati nelle varie celle a cui ci si riferisce.

    Ad esempo:  Application.Run "RicProg001.xlsm!Cell_4_3" richiama la seguente macro: 

    Sub Cell_4_3()

        Condizione = Cells(4, 1)

    If Condizione = 1 Then

        Dim FName As String

        FName = Cells(4, 3)

        Workbooks.Open Filename:=FName, UpdateLinks:=3

        Application.Wait Now + TimeValue("00:00:10")

        ActiveWorkbook.Save

        ActiveWindow.Close

        Windows("RicProg001.xlsm").Activate

    End If

    End Sub

    Nella cella C4 del Foglio1 della cartella RicProg001.xlsm

    vi è scritto: C:\Documenti\CCS\Forza6.xlsm.

    Così viene richiamata la cartella Forza6.xlsm che si collega ad una o più banche dati situate in  C:\Documenti\CCS.

    Quindi la cartella viene ricalcolata attivano macro e function al suo interno e poi salvata e chiusa.

    Alla fine viene ricaricata la macro "RicProg001.xlsm!Risultati" si collega a tutte le cartelle che sono state aperte, ricalcolate, salvate e richiuse e fornisce il risultato finale.

    In realtà la macro "Sub RicalSalv()" viene attivata da un'altra macro che si occupa di fare parecchie altre cose diverse.

    Se noti ad inizio riga di dove si trova l'istruzione Application.Run "RicProg001.xlsm!Risultati" vi è un apostrofo che serve ad inibire il comando.

    Infatti per accelerare l'esecuzione della macro la "RicProg001.xlsm!Risultati" viene attivata prima di iniziare a far funzionare la macro "Sub RicalSalv()" , ma non vengono attivati i collegamenti, nè i ricalcoli, queste cose vengono attivate mano a mano che vengono richiamate la varie cartelle e la cartella contenete i risultati finali resta aperta per tutto il tempo in cui "Sub RicalSalv()" funziona; in questo modo ho risparmiato circa 6' di tempo.

    Inoltre se la macro "Sub RicalSalv()" dovesse arrestarsi prima del previsto potrei farla ripartiredal punto in cui si è interrotta, perchè nella cartella che contiene i risultati potre individuare quali sono le cartelle che non sono state ricalcolate.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2020-04-30T10:35:50+00:00

    Così nn ho molte informazioni.
    Quelle Cell_2_3, Cell_3_3 etc sono altre macro che vengono richiamate da questa, presenti nel file RicProg001

    Mi dovresti mostrare quelle più la funzione Risultati, questa funzione non fa altro che richiamarle tutte

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2020-04-30T10:27:56+00:00

    La terminologia che ho usato io è la seguente:

    i termini File e Cartella, in Excel, indicano la stessa cosa, infatti se da una Cartella ne vuoi creare un'altra devi cliccare su "File" per aprire un menù e quindi cliccare su "nuovo" dopo di che selezionare "Cartella di lavoro vuota" a questo punto viene generata Cartel1.xlsx contenente solo "Foglio1", a questo punto si possono generare altri fogli al suo interno e le si può cambiare terminazione in .xlxm.

    Riassumendo la Cartella ha terminazione .xlsx oppure .xlsm e contiene uno o più fogli, se si salva una cartella in una Directory la si ritrova in un elenco di file.

    Per ciò che riguarda i tempi hai ragione: i tempi che ti ho riportato sono quelli di una singola operazione di rapertura fatta a mano, passando alla modalità automatica la cosa cambia.

    Ora ti riporto una macro che richiama, ricalcola e salva 25 Cartelle, con terminazione .xlsm, in 18' e 57"

    Come vedrai essa è strutturata per impiegare molte più cartelle, non solo le 25 che uso normalmente.

    Sub RicalSalv()

        Application.Run "RicProg001.xlsm!Cell_2_3"

       Application.Run "RicProg001.xlsm!Cell_3_3"

        Application.Run "RicProg001.xlsm!Cell_4_3"

        Application.Run "RicProg001.xlsm!Cell_5_3"

        Application.Run "RicProg001.xlsm!Cell_6_3"

        Application.Run "RicProg001.xlsm!Cell_7_3"

        Application.Run "RicProg001.xlsm!Cell_8_3"

        Application.Run "RicProg001.xlsm!Cell_9_3"

        Application.Run "RicProg001.xlsm!Cell_10_3"

        Application.Run "RicProg001.xlsm!Cell_11_3"

        Application.Run "RicProg001.xlsm!Cell_12_3"

        Application.Run "RicProg001.xlsm!Cell_13_3"

        Application.Run "RicProg001.xlsm!Cell_14_3"

        Application.Run "RicProg001.xlsm!Cell_15_3"

        Application.Run "RicProg001.xlsm!Cell_16_3"

        Application.Run "RicProg001.xlsm!Cell_17_3"

        Application.Run "RicProg001.xlsm!Cell_18_3"

        Application.Run "RicProg001.xlsm!Cell_19_3"

        Application.Run "RicProg001.xlsm!Cell_20_3"

        Application.Run "RicProg001.xlsm!Cell_21_3"

        Application.Run "RicProg001.xlsm!Cell_22_3"

        Application.Run "RicProg001.xlsm!Cell_23_3"

        Application.Run "RicProg001.xlsm!Cell_24_3"

        Application.Run "RicProg001.xlsm!Cell_25_3"

        Application.Run "RicProg001.xlsm!Cell_26_3"

        Application.Run "RicProg001.xlsm!Cell_27_3"

        Application.Run "RicProg001.xlsm!Cell_28_3"

        Application.Run "RicProg001.xlsm!Cell_29_3"

        Application.Run "RicProg001.xlsm!Cell_30_3"

        Application.Run "RicProg001.xlsm!Cell_31_3"

        Application.Run "RicProg001.xlsm!Cell_32_3"

        Application.Run "RicProg001.xlsm!Cell_33_3"

        Application.Run "RicProg001.xlsm!Cell_35_3"

        Application.Run "RicProg001.xlsm!Cell_36_3"

        Application.Run "RicProg001.xlsm!Cell_37_3"

        Application.Run "RicProg001.xlsm!Cell_38_3"

        Application.Run "RicProg001.xlsm!Cell_39_3"

        Application.Run "RicProg001.xlsm!Cell_40_3"

        Application.Run "RicProg001.xlsm!Cell_41_3"

        Application.Run "RicProg001.xlsm!Cell_42_3"

        Application.Run "RicProg001.xlsm!Cell_43_3"

        Application.Run "RicProg001.xlsm!Cell_44_3"

        Application.Run "RicProg001.xlsm!Cell_45_3"

        Application.Run "RicProg001.xlsm!Cell_46_3"

        Application.Run "RicProg001.xlsm!Cell_47_3"

        Application.Run "RicProg001.xlsm!Cell_49_3"

        Application.Run "RicProg001.xlsm!Cell_50_3"

        Application.Run "RicProg001.xlsm!Cell_51_3"

        Application.Run "RicProg001.xlsm!Cell_52_3"

    '    Application.Run "RicProg001.xlsm!Risultati"

        Beep

        Beep

        Beep

    End Sub

    A presto

    La risposta è stata utile?

    0 commenti Nessun commento