Diskuze: Jak upravit program pro hledání hesla ?
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Po úspěšném spuštění prvního testovacího programu na GPU (Visual Studio 2022 a CUDA Toolkit) se pokouším převést program výše z Linuxu do Visual Studia 2022 (VS 2022).
Potřeboval bych poradit, jakou knihovnou ve VS 2022 nahradit Linuxovou knihovnu:
#include <sys/time.h>
Při měření času je v programu použita funkce:
long long timems() {
struct timeval end;
gettimeofday(&end, NULL);
return end.tv_sec * 1000LL + end.tv_usec / 1000;
}
#include <stdio.h>
#include <winsock2.h> // struct timeval
#include <windows.h> // timeGetTime()
#pragma comment( lib, "winmm.lib") // timeGetTime()
typedef unsigned long DWORD;
int gettimeofday(struct timeval* tp, void* tzp);
long long timems(void);
int main(void) {
long long val = timems();
printf("%lld\n", val);
return 0;
}
int gettimeofday(struct timeval* tp, void* tzp) {
DWORD t;
t = timeGetTime();
tp->tv_sec = t / 1000;
tp->tv_usec = t % 1000;
return 0;
}
long long timems(void) {
struct timeval end;
gettimeofday(&end, NULL);
return end.tv_sec * 1000LL + end.tv_usec / 1000;
}
Super skvělý, díky, na to bych nepřišel. Chyby u času již zmizely .
Poslední problém je jak nahradit funkce (ovládání vláken):
pthread_mutex_init()
pthread_mutex_lock()
pthread_create()
pthread_mutex_unlock()
Linux knihovny:
#include <pthread.h>
část programu viz výše:
pthread_mutex_init(&solutionLock, NULL);
pthread_mutex_lock(&solutionLock);
unsigned long** processedPtrs = (unsigned long**)malloc(sizeof(unsigned long*) * GPUS);
pthread_t* tids = (pthread_t*)malloc(sizeof(pthread_t) * GPUS);
long long start = timems();
for (int i = 0; i < GPUS; i++) {
HandlerInput* hi = (HandlerInput*)malloc(sizeof(HandlerInput));
hi->device = i;
hi->hashesProcessed = 0;
processedPtrs[i] = &hi->hashesProcessed;
pthread_create(tids + i, NULL, launchGPUHandlerThread, hi);
usleep(10);
}
funkcemi CUDA Toolkit. Dal jsem dotaz do fóra developer.nvidia.com
Nebylo by rychlejsi misto volani cyklu pouzit primo instrukci?
for (int k=0; k < 3; k++) d[k] = s[k];
d[0] = s[0];
d[1] = s[1];
d[2] = s[2];
Zvlast, kdyz to cele provadis opakovane 1000x, tak by to mohlo mit vyznam
@Peter Mlich
Nerozumím tvému komentáři ohledně volání cyklu. Jaký cyklus myslíš ?
P.S. Program v úvodu běží na Linuxu (KALI) na mém notebooku s GPU NVIDIA
GeForce 960M v pohodě rychlostí cca 32 Gh/s . Upravuji ho, abych ho mohl spustit
pod Visual Studio 2022 s NVIDIA Toolkitem. Hledám také nějaký příklad, jak
naprogramovat funkci PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256) aby
běžela co nejrychleji (s využitím nejnovějších instrukcí CPU a během ve
více warpech na GPU).
for (int k=0; k < 3; k++) d[k] = s[k]; // tohle tam mas, a je to preci totez jako:
d[0] = s[0];
d[1] = s[1];
d[2] = s[2];
Az na to, ze, bez cyklu to pobezi rychleji a spotrebuje mene pameti.
Ale, nevim, jaky zpusobem funguji moderni urychlovace cyklu. Je mozne, ze to cpu
dokaze zpracovat paralelne a ten rozdil je pak minimalni.
Tez je zajimave, ze mas cykly:
for (i = 0; i < 64; ++i) // 1
for (int k=0; k < 11; k++) // 2
// kde ++i by melo byt rychlejsi jez i++
Proste, to vypada jako slepenec nekolika kodu, kde vlastne ani nerozumis, co
to dela a proc a to se pokousis prepsat na neco jineho, cemu take nerozumis?
Jen mi to prislo zvlastni,
jako.
Díky, jen upřesňuji, že kód je jiného autora viz odkaz zde. Prvotní odkaz na video programu v chodu je tady.
Také mi připadá, že je to celé nějaké zmatečné. Snažím se pochopit co to vlastně dělá a udělat vlastní program od začátku. Nejdříve to chci rozchodit ve Windows (Visual Studio 2022 a CUDA Toolkit), pochopit co to dělá (např. debugem proměnných) a pak to zkusit udělat od začátku nově pro funkci PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256), aby to i na obyčejné grafické kartě běželo s maximální rychlostí.
Ano, takovéto kopírování je rychlejší, ale hodí se pro velmi malý počet kopírování. V drtivé většině se používá traversování pomocí cyklu.
Kopírování prvků pole musí mít význam, v opačném případě stačí pouze předat ukazatel na pole.
Co se týká inkrementace v prefixové podobě ++i proti postfixové podobě i++, již jsem to zde na fóru psal. Pro vestavěné typy zde není žádný rozdíl. Drobný rozdíl je u tzv. compound typů, tedy typů co vytváří programátor, struktury, objekty, unie, tam je prefixová podoba zápisu nepatrně rychlejší.
Překladače ale za dobu své existence jistě neusnuly na vavřínech a dost pravděpodobně dokáží rozpoznat kód a optimalizovat jej tak, že nebude rozdíl mezi prefixovou a postfixovou formou zápisu.
Take tam vidim parkrat cislo * 8
, to by slo tez resit
shiftovanim, ne? cislo << 3
Zobrazeno 10 zpráv z 10.