This is an old revision of the document!
Tema 3 - Parallel hashtable
-  Soft deadline: 28 Mai 2023. Primiți un bonus de 10% din punctajul obtinut pentru trimiterea temei înainte de 22 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.