際際滷

際際滷Share a Scribd company logo
CONFLUX: GPGPU 亊 .NET
于亞亠仆亳亶 仄舒从仂
仆亟亠亶 仂仂仆仂于亳
亳亟亠仂从舒 亠亞仂亟仆
 舒 弍仂  亟亠从亳/仂仆亳 ALU 仆舒 舒仂亠 弍仂仍亠亠 1 GHz.
  仗亳从亠  1 TFLOPS (亳 >100 GFLOPS 亟于仂亶仆仂亶 仂仆仂亳)
 API  仗仂亳亰于仂仍仆亶 亟仂仗 从 仗舒仄亳, 从
  亟舒仆仆, 从舒亰舒亠仍亳, 仗仂亟仗仂亞舒仄仄.
 仂亰舒 API  仗仂亳 亠亠 亞仂亟舒, 仆亠从仂仍从仂 仗仂从仂仍亠仆亳亶
  亞舒亳亠从亳 仗仂亠仂仂于.
弌 仂从亳 亰亠仆亳 仗仂亞舒仄仄亳舒
弌仂于亠仄亠仆仆亠 仄仂亟亠仍亳 仗仂亞舒仄仄亳仂于舒仆亳 GPU (CUDA,
AMD Stream, OpenCL, DirectCompute):
 舒舒仍仍亠仍仆亶 舒仍亞仂亳仄 亰舒亟舒亠 仗舒仂亶: 1) 磲仂
  (亳亠舒亳 亳从仍舒), 2) 亞舒仆亳 亳亠舒亳亳.
 亊亟仂 从仂仄仗亳仍亳亠 亟舒亶于亠仂仄.
 舒 仂仆仂于亠 亞舒仆亳 亳亠舒亳亳 仂亰亟舒亠 亠亠从舒
  于亳仍亳亠仍仆 仗仂仂从仂于.
 仂亟仆亠 亟舒仆仆亠 从仂仗亳ム 于 于亳亟亠仂仗舒仄.
 舒仗从舒亠 于仗仂仍仆亠仆亳亠 亰舒亟舒亳.
 亠亰仍舒 从仂仗亳亠 于 仂仗亠舒亳于仆 仗舒仄.
亳仄亠: SAXPY 仆舒 CUDA
__global__ void Saxpy(float a, float* X, float* Y)
{
  int i = blockDim.x * blockIdx.x + threadIdx.x;
  Y[i] = a * X[i] + Y[i];
}

cudaMemcpy(X, hX, cudaMemcpyHostToDevice);
cudaMemcpy(Y, hY, cudaMemcpyHostToDevice);
Saxpy<<<256, (N + 255) / 256>>>(a, hX, hY);
cudaMemcpy(hY, Y, cudaMemcpyDeviceToHost);
仂仗仂 从 亰仆舒仂从舒仄
于亠舒亠 仍亠从舒仆亟 亰
仂 舒从
Brahma:
 弌从 亟舒仆仆: data parallel array.
 亳仍亠仆亳: 于舒亢亠仆亳 C#, LINQ-从仂仄弍亳仆舒仂.


Accelerator v2:
 弌从 亟舒仆仆: data parallel array.
 亳仍亠仆亳: 舒亳仄亠亳亠从亳亠 仂仗亠舒仂, 仆舒弍仂
  仗亠亟仂仗亠亟亠仍亠仆仆 仆从亳亶.

亅仂 舒弍仂舒亠 亟仍 仄仆仂亞亳 舒仍亞仂亳仄仂于. 仂 仂, 亠仍亳 亠
于亠于仍亠仆亳 亳仍亳 仆亠亠亞仍仆亶 亟仂仗 从 仗舒仄亳?
 于仂 仂
saxpy = @__global__ void Saxpy(float a, float* X, float* Y)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    Y[i] = a * X[i] + Y[i];
};

nvcuda.cuModuleLoadDataEx(saxpy);
nvcuda.cuMemcpyHtoD(X, Y);
nvcuda.cuParamSeti(a, X, Y);
nvcuda.cuLaunchGrid(256, (N + 255) / 256);
nvcuda.cuMemcpyDtoH(Y);
仂仆仍舒从
亊亟舒 仗亳 仆舒 弌#: 仗仂亟亟亠亢亳于舒ム 从
亟舒仆仆, 仍仂从舒仍仆亠 仗亠亠仄亠仆仆亠, 于亠于仍亠仆亳, 亳从仍.

float a;
float[] x;
[Result] float[] y;

var i = GlobalIdx.X;
y[i] = a * x[i] + y[i];
仂仆仍舒从
亠 亠弍亠 磦仆仂亞仂 仂弍亠仆亳  仆亠仗舒于仍磳仄仄 从仂亟仂仄,
仗仂亰于仂仍磳 舒弍仂舒  仂亟仆仄亳 亳仗舒仄亳 亟舒仆仆 .NET.

float[] x, y;
var cfg = new CudaConfig();
var kernel = cfg.Configure<Saxpy>();
y = kernel.Execute(a, x, y);
舒从 仂 舒弍仂舒亠?
 Front end: 亟亠从仂仄仗亳仍仂 C#.
 亠仂弍舒亰仂于舒仆亳亠 AST: 亳仆仍舒亶仆 于亰于舒亠仄 仄亠仂亟仂于,
  亟亠从亳亰舒亳 从仍舒仂于 亳 仄舒亳于仂于, 仂仂弍舒亢亠仆亳亠
  于亳仍亳亠仍仆 仂仗亠舒亳亶.
 Back end: 亞亠仆亠舒仂 PTX 亳 仄仆仂亞仂磲亠仆仂亞仂 IL.
 亳于磶从舒 从 亟舒亶于亠 nvcuda, 从仂仂亶 仄亠亠 亳仗仂仍仆
  仗仂亞舒仄仄 仆舒 舒亠仄弍仍亠亠.
丕仗亠亳
http://bitbucket.org/conflux/conflux

 仍舒-于亠亳.
 丕仄亠亠 于亳仍 hello-world 仗舒舒仍仍亠仍仆
  于亳仍亠仆亳亶: 仄仆仂亢亠仆亳亠 仄舒亳.
 舒 于亠仂仄 [仆舒 亠从亳亶 仄仂仄亠仆] 于仂从亳 亳亰亟亠亢亠从 仆舒
  JIT-从仂仄仗亳仍亳 亳亟亠 仂仗舒于亟于舒亠 亠弍 亟舒亢亠 亟仍
  仆舒亳于仆仂亞仂 从仂亟仂亞亠仆亠舒仂舒: 1x CPU < 2x CPU << GPU.
 丐仂亶仆舒 仍亳亠仆亰亳: AGPL, 亳从仍ム亠仆亳亠 亟仍 OSS-
  仗仂亠从仂于, 从仂仄仄亠亠从舒.
亠仄仂仆舒亳
弌仍亠亟ム亳亠 舒亞亳
 仗亳仄亳亰舒亳亳 亟仍 亞舒亳亠从亳 仗仂亠仂仂于 (仍亠亠仆从舒
  亟仍 仂仗亳仄舒仍仆仂亶 仗仂仗从仆仂亶 仗仂仂弍仆仂亳 仗亳
  舒仆仗仂亰亳亳亳 仄舒亳).
 仂仍亳亟舒仍仆舒 仄仂亟亠仍 仂仗亳仄亳亰舒亳亳 亳从仍仂于
  (从仂仆亳亞亳亠 仂仆仂亳亠仍仆仂 亳亠舒亳亳 亳 舒亰仄亠仂于
  从亠亶, 亠 仍亳仆亠亶仆亠 于亳亳从亳, 仂仗亳仄亳亰亳ム亳亠
  仍仂从舒仍仆仂 亟舒仆仆 于 于亳仍亳亠仍仆仂亶 亠亠从亠).
 仗仂仍仆亠仆亳亠 仆舒 从仍舒亠亠 (仍亠亟ム亳亶 舒亞 仗仂仍亠
  仗仂仍亳亟舒仍仆仂亶 仄仂亟亠仍亳: 亟仂弍舒于仍磳 于亳舒仍仆亶
  仂于亠仆 从舒  于亳仍亳亠仍仆亶 亰亠仍).
舒从仍ム亠仆亳亠


                 亠:
 http://bitbucket.org/conflux/conflux
 http://xeno-by.livejournal.com
 http://blogs.msdn.com/ru-hpc
 http://confluxhpc.net coming soon
弌弌!
andrei.varanovich@confluxhpc.net
eugene.burmako@confluxhpc.net

More Related Content

Conflux: GPGPU .NET

  • 1. CONFLUX: GPGPU 亊 .NET 于亞亠仆亳亶 仄舒从仂 仆亟亠亶 仂仂仆仂于亳
  • 2. 亳亟亠仂从舒 亠亞仂亟仆 舒 弍仂 亟亠从亳/仂仆亳 ALU 仆舒 舒仂亠 弍仂仍亠亠 1 GHz. 仗亳从亠 1 TFLOPS (亳 >100 GFLOPS 亟于仂亶仆仂亶 仂仆仂亳) API 仗仂亳亰于仂仍仆亶 亟仂仗 从 仗舒仄亳, 从 亟舒仆仆, 从舒亰舒亠仍亳, 仗仂亟仗仂亞舒仄仄. 仂亰舒 API 仗仂亳 亠亠 亞仂亟舒, 仆亠从仂仍从仂 仗仂从仂仍亠仆亳亶 亞舒亳亠从亳 仗仂亠仂仂于.
  • 3. 弌 仂从亳 亰亠仆亳 仗仂亞舒仄仄亳舒 弌仂于亠仄亠仆仆亠 仄仂亟亠仍亳 仗仂亞舒仄仄亳仂于舒仆亳 GPU (CUDA, AMD Stream, OpenCL, DirectCompute): 舒舒仍仍亠仍仆亶 舒仍亞仂亳仄 亰舒亟舒亠 仗舒仂亶: 1) 磲仂 (亳亠舒亳 亳从仍舒), 2) 亞舒仆亳 亳亠舒亳亳. 亊亟仂 从仂仄仗亳仍亳亠 亟舒亶于亠仂仄. 舒 仂仆仂于亠 亞舒仆亳 亳亠舒亳亳 仂亰亟舒亠 亠亠从舒 于亳仍亳亠仍仆 仗仂仂从仂于. 仂亟仆亠 亟舒仆仆亠 从仂仗亳ム 于 于亳亟亠仂仗舒仄. 舒仗从舒亠 于仗仂仍仆亠仆亳亠 亰舒亟舒亳. 亠亰仍舒 从仂仗亳亠 于 仂仗亠舒亳于仆 仗舒仄.
  • 4. 亳仄亠: SAXPY 仆舒 CUDA __global__ void Saxpy(float a, float* X, float* Y) { int i = blockDim.x * blockIdx.x + threadIdx.x; Y[i] = a * X[i] + Y[i]; } cudaMemcpy(X, hX, cudaMemcpyHostToDevice); cudaMemcpy(Y, hY, cudaMemcpyHostToDevice); Saxpy<<<256, (N + 255) / 256>>>(a, hX, hY); cudaMemcpy(hY, Y, cudaMemcpyDeviceToHost);
  • 7. 仂 舒从 Brahma: 弌从 亟舒仆仆: data parallel array. 亳仍亠仆亳: 于舒亢亠仆亳 C#, LINQ-从仂仄弍亳仆舒仂. Accelerator v2: 弌从 亟舒仆仆: data parallel array. 亳仍亠仆亳: 舒亳仄亠亳亠从亳亠 仂仗亠舒仂, 仆舒弍仂 仗亠亟仂仗亠亟亠仍亠仆仆 仆从亳亶. 亅仂 舒弍仂舒亠 亟仍 仄仆仂亞亳 舒仍亞仂亳仄仂于. 仂 仂, 亠仍亳 亠 于亠于仍亠仆亳 亳仍亳 仆亠亠亞仍仆亶 亟仂仗 从 仗舒仄亳?
  • 8. 于仂 仂 saxpy = @__global__ void Saxpy(float a, float* X, float* Y) { int i = blockDim.x * blockIdx.x + threadIdx.x; Y[i] = a * X[i] + Y[i]; }; nvcuda.cuModuleLoadDataEx(saxpy); nvcuda.cuMemcpyHtoD(X, Y); nvcuda.cuParamSeti(a, X, Y); nvcuda.cuLaunchGrid(256, (N + 255) / 256); nvcuda.cuMemcpyDtoH(Y);
  • 9. 仂仆仍舒从 亊亟舒 仗亳 仆舒 弌#: 仗仂亟亟亠亢亳于舒ム 从 亟舒仆仆, 仍仂从舒仍仆亠 仗亠亠仄亠仆仆亠, 于亠于仍亠仆亳, 亳从仍. float a; float[] x; [Result] float[] y; var i = GlobalIdx.X; y[i] = a * x[i] + y[i];
  • 10. 仂仆仍舒从 亠 亠弍亠 磦仆仂亞仂 仂弍亠仆亳 仆亠仗舒于仍磳仄仄 从仂亟仂仄, 仗仂亰于仂仍磳 舒弍仂舒 仂亟仆仄亳 亳仗舒仄亳 亟舒仆仆 .NET. float[] x, y; var cfg = new CudaConfig(); var kernel = cfg.Configure<Saxpy>(); y = kernel.Execute(a, x, y);
  • 11. 舒从 仂 舒弍仂舒亠? Front end: 亟亠从仂仄仗亳仍仂 C#. 亠仂弍舒亰仂于舒仆亳亠 AST: 亳仆仍舒亶仆 于亰于舒亠仄 仄亠仂亟仂于, 亟亠从亳亰舒亳 从仍舒仂于 亳 仄舒亳于仂于, 仂仂弍舒亢亠仆亳亠 于亳仍亳亠仍仆 仂仗亠舒亳亶. Back end: 亞亠仆亠舒仂 PTX 亳 仄仆仂亞仂磲亠仆仂亞仂 IL. 亳于磶从舒 从 亟舒亶于亠 nvcuda, 从仂仂亶 仄亠亠 亳仗仂仍仆 仗仂亞舒仄仄 仆舒 舒亠仄弍仍亠亠.
  • 12. 丕仗亠亳 http://bitbucket.org/conflux/conflux 仍舒-于亠亳. 丕仄亠亠 于亳仍 hello-world 仗舒舒仍仍亠仍仆 于亳仍亠仆亳亶: 仄仆仂亢亠仆亳亠 仄舒亳. 舒 于亠仂仄 [仆舒 亠从亳亶 仄仂仄亠仆] 于仂从亳 亳亰亟亠亢亠从 仆舒 JIT-从仂仄仗亳仍亳 亳亟亠 仂仗舒于亟于舒亠 亠弍 亟舒亢亠 亟仍 仆舒亳于仆仂亞仂 从仂亟仂亞亠仆亠舒仂舒: 1x CPU < 2x CPU << GPU. 丐仂亶仆舒 仍亳亠仆亰亳: AGPL, 亳从仍ム亠仆亳亠 亟仍 OSS- 仗仂亠从仂于, 从仂仄仄亠亠从舒.
  • 14. 弌仍亠亟ム亳亠 舒亞亳 仗亳仄亳亰舒亳亳 亟仍 亞舒亳亠从亳 仗仂亠仂仂于 (仍亠亠仆从舒 亟仍 仂仗亳仄舒仍仆仂亶 仗仂仗从仆仂亶 仗仂仂弍仆仂亳 仗亳 舒仆仗仂亰亳亳亳 仄舒亳). 仂仍亳亟舒仍仆舒 仄仂亟亠仍 仂仗亳仄亳亰舒亳亳 亳从仍仂于 (从仂仆亳亞亳亠 仂仆仂亳亠仍仆仂 亳亠舒亳亳 亳 舒亰仄亠仂于 从亠亶, 亠 仍亳仆亠亶仆亠 于亳亳从亳, 仂仗亳仄亳亰亳ム亳亠 仍仂从舒仍仆仂 亟舒仆仆 于 于亳仍亳亠仍仆仂亶 亠亠从亠). 仗仂仍仆亠仆亳亠 仆舒 从仍舒亠亠 (仍亠亟ム亳亶 舒亞 仗仂仍亠 仗仂仍亳亟舒仍仆仂亶 仄仂亟亠仍亳: 亟仂弍舒于仍磳 于亳舒仍仆亶 仂于亠仆 从舒 于亳仍亳亠仍仆亶 亰亠仍).
  • 15. 舒从仍ム亠仆亳亠 亠: http://bitbucket.org/conflux/conflux http://xeno-by.livejournal.com http://blogs.msdn.com/ru-hpc http://confluxhpc.net coming soon