CUDA рдкрд░ O (N) рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ

рдкрд░рд┐рдЪрдп

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХреЛрдб рдФрд░ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╡ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд░ рдХреА рдПрдХ рдЕрдиреВрдареА рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдерд╛ ...

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЫрдБрдЯрд╛рдИ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВред

рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд░рдгреА рдХреЗ рдЕрдиреВрдареЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓рд╛

CUDA рдХреЛ рдЙрди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдмреНрд░рд╛рдВрдб рдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, CUDA рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ , рдФрд░ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдЯреАрдЖрдИ рдФрд░ рдУрдкрдирд╕реАрдПрд▓ рд╕реЗ рд╕рдорд╛рди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ GPU рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рдХрд╕рд┐рдд рд╣реИред

CUDA рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЦреЛрдЬ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ ред рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рд╣реИ

рдЫрд╡рд┐

, рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ QSORT рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ O (NlogN) рд╕реЗ O (N ^ 2) рддрдХ рдСрд░реНрдбрд░ рдЬрдЯрд┐рд▓рддрд╛ рджреЗрддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ GPU рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░рдг рдиреЗ рд▓реЗрдЦ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╢реНрди рдореЗрдВ рдХреНрд░реЗрдк рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдбрд░рд╛рд╡рдирд╛ рдерд╛)ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдУ (рдПрди) рдХреА рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде "рдПрдХ рдкрдВрдХреНрддрд┐"ред





рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ: рдЖрдзреБрдирд┐рдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдВ 500 * 32 рд╕реЗ рдЕрдзрд┐рдХ рдзрд╛рдЧреЗ (GTX275) рд╣реИрдВ, рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓рдЧрднрдЧ 15,000ред

рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ: 1000 рддрддреНрд╡реЛрдВ рддрдХ рдХреА рд╕рд░рдгреА (рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдмрдбрд╝реЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдерд╛)ред рдУ (NlogN) рд╕рдордп рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рдЫрд╛рдВрдЯрдирд╛, 15,000 рдзрд╛рдЧреЗ рд╣реЛрдиреЗ рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдмреЗрдХрд╛рд░ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред



рдкреЗрдкрд┐рд░рд╕ рддрд░реНрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдпрд╣ рдУ (рдПрди) рд╣реИ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ рдУ (рдПрди) рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХрд░реЗред рдпрд╛рдиреА рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдПрд░реЗ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░реЗред рдФрд░ рдкрд╛рд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдХреБрдВрдЬреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд░рд┐рдгрд╛рдореА рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕реНрд╡рдпрдВ рдереНрд░реЗрдб рдирдВрдмрд░ tid (рдЖрдорддреМрд░ рдкрд░ 0..MaxThreads-1 рд╕реЗ) рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ tid рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдореВрд▓ рд╕рд░рдгреА рдХреЛ A [] = {1,5,2,4,7} рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реБрдП, рд╣рдо рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рдгрд╛рдо B [] рдореЗрдВ рддрддреНрд╡ A [tid] рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред



рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рд░рдгреА K [] рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддрддреНрд╡ A [tid] рдХреА рд╕реНрдерд┐рддрд┐ред ArraySize - рдП [] рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред

рдЕрдм рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрд╡рдпрдВ CUDA C (.cu рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

1. MainKernel ( kernel.cu) ArraySize .

MainKernel <<<grids, threads>>> (A,B,ArraySize,MaxThreads);



2. CUDA- MainKernel ( kernel.cu) A[], ArraySize, MaxThreads, B[] K[].

unsigned long tid = blockIdx.x*blockDim.x + threadIdx.x; //

for (unsigned long i = 0;i<ArraySize;++i) // O(N)

if (A[i]<A[tid])

++K[tid]; // O(1)



3. __syncthreads(); // , .. tid-



4. B[K[tid]] = A[tid]; // ( O(1), 3 qsort, swap ..)

* , K[]={0,0,2,3,4}.

.4 , ( O(1)). .








рдФрд░ рд╡рд╣ рд╕рдм, рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА B [] O (N) рджреНрд╡рд╛рд░рд╛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдЙрдкрд▓рдмреНрдз рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ N рдХреЗ рдмрд░рд╛рдмрд░ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред



рдПрдХ рдмрдбрд╝реЗ рд╕рд░рдгреА рдХреЗ рдЕрдиреВрдареЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓рд╛

рдЕрдм, рдпрджрд┐ рдЖрдк рд╕рд░рдгреА рдХреЗ рдЖрдпрд╛рдо рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧрд╛ рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдЦреЗрдЧрд╛

[ArraySize / MaxThreads] - (рддрддреНрд╡реЛрдВ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рднрд╛рдЧ)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд░рдирд┐рдВрдЧ рдЯрд╛рдЗрдо рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ [ArraySize / MaxThreads] * O (N), рдпрд╛рдиреА рдпрд╣ рдХрдИ рдмрд╛рд░ рдмрди рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдореЗрдВ рдХрдИ рддрддреНрд╡ рдЙрдкрд▓рдмреНрдз рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВред



рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдлрд╛рд░реНрдо рд╣реЛрдЧрд╛:

1. MainKernel ( kernel.cu) [ArraySize/MaxThreads] .

MainKernel <<<grids, threads>>> (A,B,ArraySize,MaxThreads);



2. CUDA- MainKernel ( kernel.cu) A[], ArraySize, MaxThreads, B[] K[].

unsigned long tid = blockIdx.x*blockDim.x + threadIdx.x; //



2.5. , .

unsigned long c = ArraySize/MaxThreads;

for (unsigned long j = 0;j<c;++j) {

unsigned int ttid = c*tid + j; // -



for (unsigned long i = 0;i<ArraySize;++i)

if (A[i]<A[ttid])

++K[ttid]; //



3. __syncthreads(); // , .. tid-



4. B[K[ttid]] = A[ttid]; //

} //








рдирд┐рд╖реНрдХрд░реНрд╖ 1

рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦреА рд╕рдВрдЦреНрдпрд╛ tid рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛:

for (unsigned long i = 0;i<ArraySize;++i) if (A[i]<A[tid]) ++K[tid];





рдпрд╣ рдерд╛: рдП [i] - рдПрдХ рдЕрдирд╕реБрд▓рдЭрд╛ рд╕рд░рдгреАред рдЕрдм K [tid] - рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрд░реЛрдд рддрддреНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред B [K [tid]] = A [tid] рдФрд░ B [ArraySize-K [tid] -1] = A [tid] рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдХреЗ рдЫрдБрдЯрд╛рдИ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИред



рд╢реБрд░реБрдЖрдд рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг

рдпрд╣ рдерд╛: A [] = {1,5,2,4,7}ред ArraySize = 5. рд╣рдо 5 рдкреНрд░рд╡рд╛рд╣ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдЯреНрд░реАрдо 0. tid = 0. рд╕реЗрдЯ K [tid] = K [0] A [tid] = A [0] = 1: K [0] = 0 рдХреЗ рд▓рд┐рдП

рд╕реНрдЯреНрд░реАрдо 1. tid = 1. рд╕реЗрдЯ K [tid] = K [1] A [tid] = A [1] = 5: K [1] = 3

рдзрд╛рд░рд╛ 2. tid = 2. A [2] = 2ред рдХреЗ [реи] = рез

рд╕реНрдЯреНрд░реАрдо 3. tid = 3. A [3] = 4ред рдХреЗ [рей] = реи

рд╕реНрдЯреНрд░реАрдо 4. tid = 4. A [4] = 7ред рдХреЗ [рек] = рек

рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм, рдЪреВрдВрдХрд┐ рд╕рднреА рдзрд╛рдЧреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдереЗ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рд╕рд░рдгреА - рдУ (рдПрди) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрдВрдЯрдиреА рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдФрд░ рдЙрдиреНрд╣реЗрдВ K [] = {0,3,1,2,4} рдорд┐рд▓рд╛ред



рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдЬрдм [ArraySize / MaxThreads] рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ > ArraySize, рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо O (N ^ 2) рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рд▓реЗрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореВрд▓ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред



рдирд┐рд╖реНрдХрд░реНрд╖ реи

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдУ (рдПрди) рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдФрд░ рдУ (рдПрди) рд╕рд░реНрд╡реЛрддреНрддрдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рд▓ рдХреА рдЧрдИ рдереА (рддреНрд╡рд░рдг рдХреЗрд╡рд▓ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдПрди рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдХрд╛рд░рдг рдерд╛)ред рдФрд░ рдлрд┐рд░ рдмрд╢рд░реНрддреЗ рдХрд┐ рдереНрд░реЗрдб рдХреА рдЙрдкрд▓рдмреНрдз рд╕рдВрдЦреНрдпрд╛ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред



рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдиреМрд╕рд┐рдЦрд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢реЛрдзрдХрд░реНрддрд╛рдУрдВ рдХреЛ GPGPU рдкрд░ рддреЗрдЬреА рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╡реИрдЪрд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рд╛рд╣рд┐рддреНрдп рд╕реЗ, рдореИрдВ рдХреЙрд░реНрдореЗрди рдХреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдкреБрд╕реНрддрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдкреЛрд░реНрдЯрд▓ рдХреЛ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВ projecteuler.netред



UPD1ред (12/17/2010 1:40 PM)

рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрджрд┐ рдореВрд▓ рд╕рд░рдгреА A [] рдореЗрдВ 16KB рдореЗрдореЛрд░реА рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо B [] __sared__ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдФрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ CUDA рдореЗрдВ рдПрдХ рд╕реНрддрд░ 2 рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ) - рдХреНрдпреЛрдВрдХрд┐ __sared__ рдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ 16KB рд╣реИ (GTX275 рдХреЗ рд▓рд┐рдП)ред

рдЗрд╕рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ "рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реНрд╡реИрдк" рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рдореВрд▓ рдП [] рд╣реЛрддрд╛ рд╣реИ:

1. for (unsigned long i = 0;i<ArraySize;i++)

if (A[i]<A[tid])

K[tid]++; //



2. __syncthreads(); // !



3. unsigned long B_tid = A[tid]; //, ""



4. __syncthreads(); // ""



5. A[K[tid]] = B_tid; //






рдЕрдм рдореВрд▓ рд╕рд░рдгреА A [] рдХрдо рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



UPD2ред (12/17/2010 16:34, рд╡рд┐рд╖рдп )

__Sared__ рдореЗрдореЛрд░реА рдФрд░ рдЫреЛрдЯреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдХрдо рдкрд╣реБрдБрдЪ рдХреЗ рдХрд╛рд░рдг рддреЗрдЬрд╝ рд╡рд┐рдХрд▓реНрдкред

0. unsigned int K_tid = 0;



1. unsigned long B_tid = A[tid]; //, ""



2. for (unsigned long i = 0;i<ArraySize;++i)

if (A[i]<B_tid)

++K_tid; //



3. __syncthreads(); // ""



4. A[K_tid] = B_tid; //








UPD3 ред ( 12.20.2010 14:16) рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ: main.cpp , kernel.cu (рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреА __sared__ рдореЗрдореЛрд░реА рдХреЗ рднреАрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред



UPD4 ред (12/23/2010 2:56 рдЕрдкрд░рд╛рд╣реНрди) рдЬрдЯрд┐рд▓рддрд╛ O (N) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд░реИрдЦрд┐рдХ рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ ╬Ш (n + k) ┬й рд╡рд┐рдХреА рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдЫрдВрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред



All Articles