Weitere ähnliche Inhalte Ähnlich wie C#, C/CLI と CUDAによる画像処理ことはじめ (20) Mehr von NVIDIA Japan (20) C#, C/CLI と CUDAによる画像処理ことはじめ1. C#, C++/CLI と CUDA による
画像処理ことはじめ
επιστημη epi@c.zaq.jp
・Microsoft MVP
for Visual C++ Jan.2004~
for Visual Studio and Development Technologies Oct.2015~
・NVIDIA Ambassador for CUDA Apr.2015~
9. MANAGED と NATIVE の仲介役
host
memory
device
memory
PCI
CLR
managed app.
native assembly
call
12. HOST CODE と DEVICE CODE
__host__ __global__ __device__
※ __global__ : host から呼べる device 側の関数
Host(CPU) で動く関数 Device(GPU) で動く関数
13. CUDAのコードはHOST/DEVICE混在(1)
__device__ int device_increment(int n) { return n+1; }
__global__ void kernel_increment(int* data, unsigned int size) {
unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
if ( i < size ) {
data[i] = device_increment(data[i]);
}
}
__host__ void launch_increment(int* data, unsigned int size) {
kernel_increment<<<2000,100>>>(data, size);
} 100スレッドを1ブロックとして2000ブロック分着火せよ!
14. CUDAのコードはHOST/DEVICE混在(2)
int main() {
vector<int> array; // host-memory
…
size_t bytesize = array.size()*sizeof(int);
int* d_array; // device-memory
cudaMalloc(&d_array, bytesize); // allocate device-memory
// host→device , launch kernel , device→host
cudaMemcpy(d_array, array.data(), bytesize, cudaMemcpyHostToDevice);
launch_increment(d_array, array.size());
cudaMemcpy(array.data(), d_array, bytesize, cudaMemcpyDeviceToHost);
…
cudaFree(d_array); // deallocate device-memory
}
20. C++/CLI によるwrapper
• constructor
• allocate device-mem
• methods
• pin managed (raw)
• copy raw → device-mem
• launch kernel
• copy device-mem → raw
• un-pin managed (raw)
• destructor
• deallocate device-mem
managed(C#) application
21. public ref class Wrapper {
private:
managed側には見せたくない/見せる必要のないもの
public:
// コンストラクタ
Wrapper() { 前準備 }
// デストラクタ
~Wrapper() { this->!Wrapper(); }
// ファイナライザ
!Wrapper() { あとしまつ }
void do_something() {
nativeなナニかを操作する
}
};
22. public ref class Wrapper {
private:
float* data_; // device-memory
int size_;
public:
// コンストラクタ
Wrapper(int n) : size_(n) {
float* ptr;
cudaMalloc(&ptr, size_*sizeof(float));
data_ = ptr;
}
// デストラクタ
~Wrapper() { this->!Wrapper(); }
// ファイナライザ
!Wrapper() {
cudaFree(data_);
}
…
たとえば…こんなコード。
23. public ref class Wrapper {
// method
void do_something(cli::array<float>^ buffer) {
if ( buffer->Length <= size_ ) {
pin_ptr<float> pin = &buffer[0];
cudaMemcpy(data_, pin, …); // host -> device
launch_kernel(…); // launch kernel
cudaMemcpy(pin, data_, …); // device -> host
}
}
たとえば…こんなコード。
28. BGR BGR Gray Gray
SobelV
SobelH
floatuchar3 ucharuchar3
float
float
NPP
cudaMemcpy
BGR
uchar3
29. THANK YOU, LET’S ENJOY CUDA!
επιστημη
mail: epi@c.zaq.jp
blog: http://blog.zaq.ne.jp/fareastprogramming/
facebook: https://www.facebook.com/cppepisteme
twitter: @epitwit