Tema 3

  • Deadline soft + hard: 17 mai 2020, ora 23:55. Primiți un bonus de 10% din punctajul obtinut pentru trimiterea temei înainte de 14 mai 2020 2020, ora 23:55.

Enunț

Se va implementa o structură de date tip hashtable folosind CUDA, având ca target GPU Tesla K40 (hp-sl.q).

Tema se poate dezvolta pe orice sistem cu suport CUDA, dar punctarea se face exclusiv pe coada hp-sl.q

Această structură de date tip hashtable va avea următoarele caracteristici:

  1. va face maparea key → value, (o singură valoare per key)
  2. 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
  3. 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)
  4. 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)
  5. 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)
  6. va putea întoarce corect, într-un timp rapid, valoarea corespunzătoare unei chei
  7. va întoarce încărcarea (memoria efectiv folosită / memoria alocată) via funcția load_factor
  8. implementare greșită sau neclară poate duce la o depunctare suplimentară

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.

Schelet tema

Se va completa scheletul pus la dispoziție (gpu_map.cu) având următoarele funcții ce trebuie implementate:

/* INIT HASH
 */
GpuHashTable::GpuHashTable(int size) { }

/* DESTROY HASH
 */
GpuHashTable::~GpuHashTable() { }

/* RESHAPE HASH
 */
void GpuHashTable::reshape(int numBucketsReshape) { }

/* INSERT BATCH
 */
bool GpuHashTable::insertBatch(int *keys, int* values, int numKeys) { return false; }

/* GET BATCH
 */
int* GpuHashTable::getBatch(int* keys, int numKeys) { return NULL; }

/* GET LOAD FACTOR
 * num elements / hash total slots elements
 */
float GpuHashTable::loadFactor() {
	return 0.f; // no larger than 1.0f = 100%
}

#define HASH_INIT GpuHashTable GpuHashTable(1);
#define HASH_RESERVE(size) GpuHashTable.reshape(size);

#define HASH_BATCH_INSERT(keys, values, numKeys) GpuHashTable.insertBatch(keys, values, numKeys)
#define HASH_BATCH_GET(keys, numKeys) GpuHashTable.getBatch(keys, numKeys)

#define HASH_LOAD_FACTOR GpuHashTable.loadFactor()

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 Makefile, gpu_hashtable.cu si gpu_hashtable.hpp.

Punctajul maxim este de 100 pct distribuite astfel:

  • [ 90 pct ] Punctaj dat de bench.py, performanța trebuie să fie similară și în alte configurații. A nu se optimiza soluția pentru trecerea testelor!
  • [ 10 pct ] Implementare descrisă în README, alături de rezultate și o discuție asupra lor. Programul compilează, codul nu are disfuncționalități majore

Arhiva va cuprinde obligatoriu fișierele cu soluția și alte fișiere adiționale folosite, dar minim: - gpu_hashtable.cu - gpu_hashtable.hpp - Makefile, dacă sunt necesare modificări - Readme, unde se explică:

  • Cum s-a implementat soluția ? (3p)
  • Cum se stochează hashtable în memoria GPU VRAM ? (3p)
  • Output la performanțele obținute și discutie rezultate. (4p)

Precizări și recomandări

În cazul în care job-urile vă rămân “agățate”, va recomandam să utilizați de pe fep.grid.pub.ro, comanda

 qstat 

pentru a vedea câte job-uri aveți pornite, și apoi să utilizați comanda

qdel -f <id-sesiune> 

unde <id-sesiune> sunt primele cifre din stânga, rezultate după comanda qstat.

Sesiunile interactive deschise prin qlogin nu sunt permise pe coada hp-sl.q. Va trebui sa utilizati qsub pentru a folosi aceasta coada.

Resurse

asc/teme/tema3.txt · Last modified: 2020/05/08 22:03 by florin.mihalache
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0