Obećao sam pokazati inline assembler a nisam.
Isprika, ali nije teško pogledati dokument
[tt]Using_Inline_PTX_Assembly_In_CUDA.pdf[/tt]
u [tt]doc/pdf[/tt] poddirektoriju CUDA instalacije.
Da biste od toga imali koristi, pogledajte
[tt]ptx_isa_3.1.pdf[/tt]
na istom mjestu.
Recimo, [tt]red[/tt] instrukcije, specijalni registri - kao što su [tt]%laneid[/tt], [tt]%smid[/tt] i sl. mogu biti upotrebljeni u "normalnom" kodu.
Evo dva primjera:
[code:1]unsigned lid; // u ovu ćemo varijablu spremiti lane ID ("redni broj" threada u warpu)
asm ("mov.u32 %0, %%laneid;" : "=r"(lid)); // dohvatimo i spremimo lane ID u varijablu
if (lid ...) ... // sad možemo nešto učiniti temeljem pozicije threada u warpu[/code:1]
[code:1]// pokazivač na mapiranu CPU memoriju u kojoj će pisati "dogovor" svih thredova jednog kernela o nekom statusu,
// npr. broj threadova koji su uspjeli izvršiti neku predviđenu operaciju
// pokazivač je mogao biti i na GPU memoriju, ovo je samo ilustracija da to radi
__constant__ volatile unsigned long *statusOnCPU;
// ...negdje u kernelu...
unsigned long mySuccess = // 1 ili 0;
// atomarno dodaj mySuccess na statusOnCPU, ne zanima me nova vrijednost statusa
asm volatile ("red.global.add.u64 [%0], %1;" :: "l"(statusOnCPU), "l"(mySuccess) : "memory");[/code:1]
Obećao sam pokazati inline assembler a nisam.
Isprika, ali nije teško pogledati dokument
Using_Inline_PTX_Assembly_In_CUDA.pdf
u doc/pdf poddirektoriju CUDA instalacije.
Da biste od toga imali koristi, pogledajte
ptx_isa_3.1.pdf
na istom mjestu.
Recimo, red instrukcije, specijalni registri - kao što su %laneid, %smid i sl. mogu biti upotrebljeni u "normalnom" kodu.
Evo dva primjera:
Kod: | unsigned lid; // u ovu ćemo varijablu spremiti lane ID ("redni broj" threada u warpu)
asm ("mov.u32 %0, %%laneid;" : "=r"(lid)); // dohvatimo i spremimo lane ID u varijablu
if (lid ...) ... // sad možemo nešto učiniti temeljem pozicije threada u warpu |
Kod: | // pokazivač na mapiranu CPU memoriju u kojoj će pisati "dogovor" svih thredova jednog kernela o nekom statusu,
// npr. broj threadova koji su uspjeli izvršiti neku predviđenu operaciju
// pokazivač je mogao biti i na GPU memoriju, ovo je samo ilustracija da to radi
__constant__ volatile unsigned long *statusOnCPU;
// ...negdje u kernelu...
unsigned long mySuccess = // 1 ili 0;
// atomarno dodaj mySuccess na statusOnCPU, ne zanima me nova vrijednost statusa
asm volatile ("red.global.add.u64 [%0], %1;" :: "l"(statusOnCPU), "l"(mySuccess) : "memory"); |
|