Tema 3 - Parallel hashtable
Soft deadline: 28 Mai 2023. Primiți un bonus de 10% din punctajul obtinut pentru trimiterea temei înainte de 25 mai 2023, ora 23:55.
Hard deadline: 2 Iunie 2023. Veți primi o depunctare de 10% din punctajul maxim al temei pentru fiecare zi de întârziere.
-
Enunț
Se va implementa o structură de date tip hashtable folosind CUDA.
Această structură de date tip hashtable va avea următoarele caracteristici:
va face maparea key → value, (o singură valoare per key)
va putea stoca date de tip int32, mai mari strict ca 0, atât pentru chei, cât și pentru valori
valid (key→value): 1234 → 8965, 12334244 → 8223965
invalid (key→value): 0 → 9779, -12334244 → 83965, 7868 → -977, “jknjjk” → 78
va stoca datele în VRAM și va putea să își reajusteze dimensiunea cât să poată acomoda numărul de perechi key→value, având un loadFactor decent (sloturi ocupate / sloturi disponibile)
va rezolva intern coliziunile (exemplu: prin resize, folosind multe funcții de hash etc.)
funcțiile hash vor fi pentru cazurile generale (ex. cele de tip ax % b, a si b prime)
exemplu de funcție hash neacceptată: h(x) = x % limit, atunci când cheile sunt tot timpul în ordine crescătoare pe intervale și unice (nu tratează cazul general)
va face update la valoarea unei chei → operația de insert nu va conține niciodată 2 chei identice, însă operații succesive de insert nu au restricții (se va face update de valoare)
va putea întoarce corect, într-un timp rapid, valoarea corespunzătoare unei chei
va întoarce încărcarea (memoria efectiv folosită / memoria alocată) via funcția load_factor
Implementarea temei are design la liber, cât timp testele trec și soluția este una rezonabilă, neavând ca scop trecerea testelor (ex. «așa nu» comportamentul tabelei hash e strict modelat pe teste, când se face resize etc).
Exemple de implementări:
Linear probing - se calculează hash(key) și se dacă slotul nu e liber se încearcă succesiv hash(key) + 1… hash(key) + N
Cuckoo based - se folosesc 2-3 funcții hash și se caută un slot liber, alternativ se face evict la key2-value2 din acel slot, se inserează nouă pereche key-value, iar key2-value2 se caută să se insereze folosind o altă funcție hash din cele disponibile
Bucketized cuckoo - se folosește tehnica cuckoo, având buckets cu 2, 4, 8 sloturi fiecare.
Notare
Se pot adăuga alte fișiere care să fie incluse în program, însă nu se vor altera fișierele puse la dispoziție, exceptie fiind gpu_hashtable.cu si gpu_hashtable.hpp.
Punctajul maxim este de 100 pct distribuite astfel:
20 pct
Implementare descrisă în README, alături de rezultate și o discuție asupra lor
Programul compilează, codul nu are disfuncționalități majore
80 pct
Arhiva va cuprinde obligatoriu:
(10 pct aspect cod/solutie) Fișierele cu codul sursa și alte fișiere adiționale folosite, dar minim:
gpu_hashtable.cu
gpu_hashtable.hpp
(10 pct explicatie solutie) Readme, unde se explică:
Cum s-a implementat soluția ?
Cum se stochează hashtable în memoria GPU VRAM ?
Output la performanțele obținute și discutie rezultate.