��

♦♦♦♦♦♦� �♦♦♦♦♦♦

�������������� GPGPU ���- GPGPU�Intel MPI ���OpenCV ������������� -

����1

��

1

����������������������������������������������
�����������������������2014 ���������������������
����������������������������� (�� 1:��� PRIMERGY CX400 ����) ����������������� (�� 2:��� PRIMEHPC FX10) �������������
CX400 ������Intel64 ������������ PC �������������������
��������� PC ���������������������Intel64 �����������
���������������������������CX400 ������ NVidia �� GPGPU������������CUDA ���������������
�����CX400 ������������������������������������
���• OpenCV (CX400 ��������) � Intel Compiler �������������������
������
• CUDA ���������� GPGPU ����• MPI ���������������������������
�������� CX400 ����� MPI ������� 16 �� GPGPU �������������
����������������������������������������������
������������������������������

������������ (CX400 ����) ���

2������������ (CX400 ����) ������������������������
������������������2012 � 10 �����������������������
������������������� 1�2 ����� (�� Web ��� [1] ��������������)�
��������������CX400 ����� Intel64 �������������������
����������������� PC ���������������������������
1������������ toyohiro@isc.kyutech.ac.jp

41������ ���������� � 27 � 2015.3

��� 1: CX400 ������������

CPU
����
�����
GPGPU
GPGPU ������������

Intel Xeon E5-2680 2.70GHz (Intel64)345.6GFLOPS
128GB
NVIDIA Tesla K20m (Kepler, ����� 5GB)
1.17TFLOPS(���)1476 ����966.2TFLOPS� 2: CX400 ��������

OS
�����
���������
��������
���������GPGPU �������������

RHEL6 (64bit)
Fortran, C, C++ (����Intel), PGI FortranSSL II, BLAS, ScaLAPACK �
Gaussian, ANSYS, MATLAB, AMBER �
MPI, OpenMP
NVIDIA CUDA(ver. 5.0, 5,5)�������������� (�������������������)������������
����������������������������������������������
������������������� (SSL II �) ����������������������
��������� CX400 �������������������������������� 16������������������CX400 ������������������������������������������
��������������������������� Intel ������� (Fotran, C, C++�MPI��) �������� (MKL�����������IPP�������������,TBB�����
������) ���������������� [2]�Intel �������������������
���������������������������C++�����������������
�����GNU ��������������������������������������
��������������������������
��������������������������� GPGPU ��������GPGPU ���������������� GPGPU ������ NVIDIA Tesla K20m (Kepler ��) ������
���GPGPU ���������NVIDIA CUDA ver.5 ����������� [3][5]�������
�����Computing capability 3.5 ��� CUDA ����������������2 �

3 CX400 ������������� : ��������
�����CX400 ������������� Intel �������� GPGPU ���������
��������
���������������������������

3.1

����������

���������������������������������������������
������������ (��������) �������������������������
2

��� CUDA ������������������������������������������������

������ ���������� � 27 � 2015.3

42�������������������������������������������������
���� (RGB ��) ������������������������������� (� 1)�
���������������������������������������������
����������CX400 �������������������������� PC �������������������������������������������� SPMD(Single
Program to Multiple Data) ��������������������Intel Compiler ��������
�������������Intel MPI ������������ (������������� MPI[6]�����)�
������������������ (������) ���������� GPGPU ������
���������������GPGPU ��������� NVIDIA CUDA �����������
���� (����) � GPU ����������
��������������������������������������������
����������������������������������������������
OpenCV[4] �������
������CX400 ������ OpenCV ���������������OpenCV ������
����������������������������������������������
��������������������������������� CX400 ���������
�������������������Intel Compiler ���� OpenCV ������������
��� OpenCV ��������������������������

Frontend (CX400)
・OpenCVのセルフビルド(Intel Compiler利用)
・ジョブ投入(Intel MPI)
reply

submit

CX400 cluster
Computing node #1 (CX400)
画像処理プログラム(Intel MPI並列)

API call (CPU)

OpenCVAPI call (CUDA)

Tesla K20m GPU

Processing to
Sub Image

Computing node #2 (CX400)
画像処理プログラム(Intel MPI並列)

API call (CPU)

OpenCVAPI call (CUDA)

Tesla K20m GPU

Processing to
Sub Image

Computing node #n (CX400)
画像処理プログラム(Intel MPI並列)

API call (CPU)

OpenCVAPI call (CUDA)

Tesla K20m GPU

Processing to
Sub Image� 1: ��������������

43������ ���������� � 27 � 2015.3

������������� �����Intel �������� CUDA ����������OpenCV ������������������ ”cvwork” �������������OpenCV �������
���������� 2.4.9 �����������������������������.bashrc ��� (��� 1) ���������������
��� 1: ������ .bashrc# ��������
source /home/etc/intel2013.shexport PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:˜/cvwork/opencv-2.4.9/build/lib:$LD_LIBRARY_PATH

3.2 Intel Compiler ���� OpenCV �����������CX400 ������������� OpenCV ���������������������
��������OpenCV �����������������zip ��� sourceforge.net ������
�����zip ���������cmake ���������� Makeﬁle ��������������
������������������ (.so) ������������Intel Compiler ��������
��GNU Compiler ���������������� OpenCV ���������Intel Compiler ����������������cmake �������� C ������� (CMAKE C COMPILER) � C++������� (CMAKE CXX COMPILER) ���������������� CX400 ��� OpenCV������������� 2 �����3 �
��� 2: Intel Compiler ���� OpenCV ����$ cd && mkdir cvwork && cd cvwork$ wget wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip$ unzip opencv-2.4.9.zip$ cd opencv-2.4.9$ cmake -DCMAKE_C_COMPILER=/usr/local/intel2013/composer_xe_2013_sp1.2.144/bin/
intel64/icc -DCMAKE_CXX_COMPILER=/usr/local/intel2013/composer_xe_2013_sp1.2.144/bin/intel64/icpc -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=RELEASE DINSTALL_C_EXAMPLES=ON -DWITH_OPENCL=OFF -DWITH_UNICAP=ON -DWITH_OPENMP=ON DCMAKE_INSTALL_PREFIX=./build .
$ make && make installIntel Compiler ���������������OpenCV ������������ (opencv perfcore) ����������������������GNU Compiler(OpenMP ��) �������
������������ 875(sec) ������� (��� 3)�Intel Compiler(OpenMP ��) ������������� 539(sec) ���������� (��� 4)�40% ���������������
����������4 �
��� 3: OpenCV ���� (gcc+OpenMP 8core)$ ˜/cvwork/opencv-2.4.9/bin/opencv_perf_core
Time compensation is 37�������������������������������������� CX400 ������������
���������������������������������
4
���CX400 ������� C++����������������C++���������������������
��������
3������ ���������� � 27 � 2015.3

44��
OpenCV version: 2.4.9
OpenCV VCS version: unknown
Build type: release
Parallel framework: openmp
CPU features: sse sse2 sse3[==========] Running 1682 tests from 47 test cases.
[----------] Global test environment set-up.
[----------] 12 tests from Size_MatType_sum[ RUN] Size_MatType_sum.sum/0...
[ VALUE](127x61, 32SC1)[
OK ] Size_MatType_abs.abs/14 (1 ms)[ RUN] Size_MatType_abs.abs/15[ VALUE](127x61, 32FC1)[
OK ] Size_MatType_abs.abs/15 (0 ms)[----------] 16 tests from Size_MatType_abs (2802 ms total)[----------] Global test environment tear-down[==========] 1682 tests from 47 test cases ran. (875458 ms total)[ PASSED ] 1682 tests.

��� 4: OpenCV ���� (intel compiler+OpenMP 8core)$ ˜/cvwork/opencv-2.4.9/bin/opencv_perf_core
Time compensation is 54
OpenCV version: 2.4.9
OpenCV VCS version: unknown
Build type: release
Parallel framework: openmp
CPU features: sse sse2[==========] Running 1682 tests from 47 test cases.
[----------] Global test environment set-up.
[----------] 12 tests from Size_MatType_sum[ RUN] Size_MatType_sum.sum/0...
[ VALUE](127x61, 32SC1)[
OK ] Size_MatType_abs.abs/14 (0 ms)[ RUN] Size_MatType_abs.abs/15[ VALUE](127x61, 32FC1)[
OK ] Size_MatType_abs.abs/15 (1 ms)[----------] 16 tests from Size_MatType_abs (3029 ms total)[----------] Global test environment tear-down[==========] 1682 tests from 47 test cases ran. (539258 ms total)[ PASSED ] 1682 tests.

3.3

CUDA ������ GPGPU ����������� (RGB) ���������������������������������
�� GPGPU ������������������

45������ ���������� � 27 � 2015.3

��

GPGPU �������������
��������� GPU �����������������
����������������
��� 1 ����������������������GPU ������������������������������������GPU ����������
�������������
����������������������������������
�������������������GPGPU �������������������
������
�������GPU ���� RGB→ �������������������
CUDA ������������� (CUDA �����) �������� 5 �����������
��� 5 �”d.cu”������������������
CUDA �������C++������������������������������ C++��
��������������� kernel1 ���������� blockIdx,blockDim,threadIdx
��CUDA �����������������������������������������
����������������� (index) �������������������������
��� CUDA ������������������ kernel1 � GPU �������������
������������������������GPGPU �������������������������� [7] ���������
��� 5: RGB→ ���� GPGPU ��� (d.cu)#include <stdio.h>__global__ void kernel1(const unsigned char *src,unsigned char *dst){
long index = blockIdx.x * blockDim.x + threadIdx.x;
dst[index] = (unsigned char)((double)src[index*3+0]*0.3+(double)src[index*3+1]*0.6+(double)src[index*3+2]*0.1);}
void dconvi_test(const unsigned char *src,unsigned char *dst,long k,long t){kernel1<<<k,t>>>(src,dst);}

3.4 MPI ����������
��������������������������������������������
OpenCV ������������������������ GPGPU ��������������
�������������������� (������) ��OpenCV ��� CUDA ������
�������������3.1 ��������CX400 ����������������SPMD �����
����������������������������������������� MPI ��������������������������CX400 ����������GPGPU ���� 1 ������������������� 1 �� GPU ��������������GPGPU �����
��������5 ���������� GPGPU ����������������� GPGPU ��������������������
�������������������������
5������ ���������� � 27 � 2015.3

46����������������������� 6 �������������� 6 �”main.cc”������������������
��� 6: ��������:MPI�OpenCV ��#include <mpi.h>#include <stdio.h>#include <time.h>#include <cuda.h>#include <cuda_runtime.h>#include <fstream>#include <string>#include <sstream>#include <opencv2/opencv.hpp>
void dconvi_test(const unsigned char *src,unsigned char *dst,long k,long t);
int main(int argc,char **argv){
timespec tp;
int my_rank, my_size;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&my_size);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
printf ("%d : size (numprocs) = %d, my rank (id) = %d\n", my_rank, my_size,
my_rank);//all rank read img
cv::Mat src;
src = cv::imread("./lena.jpg");//on all rank gen subimg
long sibsize = src.cols * src.rows *src.elemSize() / my_size;
long siboff = sibsize * my_rank;
long sirbsize = src.cols * src.rows / my_size;
unsigned char *subimg = new unsigned char[sibsize];::memcpy(subimg,&src.data[siboff],sizeof(unsigned char) *sibsize);
unsigned char *subimgres = new unsigned char[sirbsize];//on all rank do cuda
int devCount;cudaGetDeviceCount(&devCount);
printf("%d : CUDA Device Query...\n",my_rank);
printf("%d : There are %d CUDA devices.\n", my_rank, devCount);
clock_gettime(CLOCK_MONOTONIC,&tp);

47

������ ���������� � 27 � 2015.3

��
printf("%d : tick at 0 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);
unsigned char *devmem_subimg;
unsigned char *devmem_subimgres;cudaMalloc((void**)&devmem_subimg,sibsize);cudaMalloc((void**)&devmem_subimgres,sirbsize);cudaMemcpy(devmem_subimg,subimg,sibsize,cudaMemcpyHostToDevice);//kernel
dconvi_test(devmem_subimg,devmem_subimgres,sirbsize/512,512);
cudaMemcpy(subimgres,devmem_subimgres,sirbsize,cudaMemcpyDeviceToHost);
cudaFree(devmem_subimg);
cudaFree(devmem_subimgres);clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 1 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);//wait for all kernel
MPI_Barrier(MPI_COMM_WORLD);
cv::Mat *result;//if rank0, gen cv::matif(my_rank == 0){
result = new cv::Mat(src.size(),CV_8UC1);}//if rank0 -> copy subimgres to result (local), else copy to rank0 node by MPI
if(my_rank == 0){
memcpy(&result->data[0],subimgres,sizeof(unsigned char) *sirbsize);}
else{
MPI_Send(subimgres, sirbsize, MPI_UNSIGNED_CHAR, 0, 0, MPI_COMM_WORLD);}
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 2 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);//if rank0 -> recv subimggres from other rank
if(my_rank == 0){
for(int i=1;i<my_size;i++){MPI_Status status;
MPI_Recv(&result->data[sirbsize *i],sirbsize,MPI_UNSIGNED_CHAR,i,0,
MPI_COMM_WORLD,&status);}}
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 3 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);
������ ���������� � 27 � 2015.3

48

��

if(my_rank == 0){
cv::imwrite("./dest.jpg",*result);}
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 4 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);
delete result;delete [] subimg;
delete [] subimgres;
MPI_Finalize();
return 0;}

3.5������������������������

�����������������CX400 �������������������������
�����������
��������� CUDA ����� (d.cu) ��������� (main.cc) �����������
������������������������������ 7 ������
��� 7: ���������
$ cd ˜/code$ nvcc -ccbin icc -Xcompiler "-O3" -gencode=arch=compute_20,code=sm_20 -gencode=
arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_35,code=compute_35 -c d.cu
$ mpiicc -I‘echo $HOME‘/cvwork/opencv-2.4.9/build/include -L‘echo $HOME‘/cvwork/
opencv-2.4.9/build/lib -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -cmain.cc$ mpiicc -L/usr/local/cuda/lib64 -L/home/usr3/c74013a/cvwork/opencv-2.4.9/build/lib main.o d.o -lcuda -lcudart -lopencv_core -lopencv_highgui���������� CUDA �����������������CUDA ������ C++���������������� C++�������������������CUDA ���������
�� nvcc ��������������������Intel Compiler ����������nvcc ���� C++������������������ -ccbin �����Intel C++ ����������
����� icc ���������
�����������������������MPI ��������������������
�����������������Intel C++��������� MPI �������������
���mpiicc �������������������OpenCV ��� CUDA ����������
������������������
���������������������������������������������
���mpiicc ������������������������������������� a.out��������

49������ ���������� � 27 � 2015.3

���������� ���������������� MPI ������������������
���������������������������
�����Intel ��������� MPI ���������������CX400 ��������
����������������������������CUDA ��� OpenCV ��������
��������������������������16 �������������������
��������������������������� 8 �����6 ������������
���”run intelmpi.sh”��������������������
��� 8: �������� (16 ���)������
$ cd ˜/src$ cat run_intelmpi.sh#!/bin/bash#PJM -L "rscgrp=xxxxxx"#PJM -L "vnode=16"#PJM -L "vnode-core=1"#PJM -P "vn-policy=abs-unpack"#PJM -X
source /home/etc/intel.sh
NUM_NODES=${PJM_VNODES}NUM_CORES=1
NUM_PROCS=16
export I_MPI_PERHOST=$NUM_CORES
export I_MPI_FABRICS=shm:ofa
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=‘echo $HOME‘/cvwork/opencv-2.4.9/build/lib:/usr/local/
cuda/lib64:/usr/local/intel2013/lib/intel64:$LD_LIBRARY_PATH
mpdboot -n $NUM_NODES -f ${PJM_O_NODEINF} -r /bin/pjrsh#debug mode
#mpiexec -check_mpi -n $NUM_PROCS ./a.out#release mode
mpiexec -n $NUM_PROCS ./a.out
mpdallexit$ pjsub ./run_intelmpi.sh����������������������������������1 �� GPGPU �������������MPI ������������ 1 �� GPGPU ��������������MPI������������� 1 ��������������������������������
������ vnode-core=1 ��������������� 1 ����������������
�� 1 �� MPI �������������������MPI �������������vnode=16�������������������� MPI ����������� (������16MPI �������)�
��������������� ”export PATH”�”export LD LIBRARY PATH”��MPI �����
� CUDA ��� OpenCV ����������������������
6���������������� rscgrp �����������������������

������ ���������� � 27 � 2015.3

50�������������MPI ���������������������������Intel �����
���� MPI ��������mpdboot ���������������������� mpdallexit�������������������������MPI �������������������
���������������������pjsub �����������������������
�������CX400 ����������������������

3.6

�������

�����������CX400 ������� GPGPU�Intel MPI ���OpenCV ���������
����������������������������������������������
���������������������������������� 4 �����������
�� 3 ������
� 3: ����
��
CX400
(CPU)
CX400
(K20m)

PC(CPU)PC(GTX780)

���

�����

�� CX400

Intel C++�� CX400

Intel C++���� PC

MSVC++

���� PC

MSVC++

�� HW
Xeon
E5-2680
Tesla K20m
(2496 core)Core i7-4770K
GeForce GTX780(2394 core)

����
���

�� HW
�����

����
(FLOPS, ���)2.7GHz128GB

172.8G(1CPU)

706MHz

5GB

1.17T

3.5GHz32GB

70�100G(1CPU)

863MHz3GB

1.3T��������������� 4 �������� (5120×5120, 10240×10240, 20480×20480, 40960×
40960, ���� OpenCV ��� lena.jpg ����������) ����������������2,600
����16 �����PC ����������������������������������
�������������������� PC ������������������������
�����CPU ���������������������� 9 ����������� 6 �� GPGPU ������������OpenCV ��������������������������
��� 9: ��������:MPI�OpenCV�GPGPU �� (main.cc)#include <mpi.h>#include <stdio.h>#include <time.h>#include <fstream>#include <string>#include <sstream>#include <opencv2/opencv.hpp>
int main(int argc,char **argv){
timespec tp;

51������ ���������� � 27 � 2015.3

��
int my_rank, my_size;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&my_size);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
printf ("%d : size (numprocs) = %d, my rank (id) = %d\n", my_rank, my_size,
my_rank);//all rank read img
cv::Mat src;
src = cv::imread("./lena.jpg");//on all rank gen subimg
long sibsize = src.cols * src.rows *src.elemSize() / my_size;
long siboff = sibsize * my_rank;
long sirbsize = src.cols * src.rows / my_size;
unsigned char *subimg = new unsigned char[sibsize];::memcpy(subimg,&src.data[siboff],sizeof(unsigned char) *sibsize);
unsigned char *subimgres = new unsigned char[sirbsize];//time cnt start
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 0 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);
cv::Mat devmem_subimg(src.rows/my_size,src.cols,CV_8UC3);
cv::Mat devmem_subimgres(src.rows/my_size,src.cols,CV_8UC1);::memcpy(&devmem_subimg.data[0],subimg,sizeof(unsigned char) *sibsize);//kernel
cv::cvtColor(devmem_subimg,devmem_subimgres,CV_RGB2GRAY);::memcpy(subimgres,&devmem_subimgres.data[0],sizeof(unsigned char) *sirbsize);clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 1 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);//wait for all node
MPI_Barrier(MPI_COMM_WORLD);
cv::Mat *result;//if rank0, gen cv::matif(my_rank == 0){
result = new cv::Mat(src.size(),CV_8UC1);}//if rank0 -> copy subimgres to result (local), else copy to rank0 node by MPI
if(my_rank == 0){
memcpy(&result->data[0],subimgres,sizeof(unsigned char) *sirbsize);}������ ���������� � 27 � 2015.3

52

��
else
{
MPI_Send(subimgres, sirbsize, MPI_UNSIGNED_CHAR, 0, 0, MPI_COMM_WORLD);}
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 2 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);//if rank0 -> recv subimggres from other rank
if(my_rank == 0){
for(int i=1;i<my_size;i++){MPI_Status status;
MPI_Recv(&result->data[sirbsize *i],sirbsize,MPI_UNSIGNED_CHAR,i,0,
MPI_COMM_WORLD,&status);}}
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 3 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);
if(my_rank == 0){
cv::imwrite("./dest.jpg",*result);}
clock_gettime(CLOCK_MONOTONIC,&tp);
printf("%d : tick at 4 %lf\n",my_rank,tp.tv_sec+tp.tv_nsec *0.001*0.001*0.001);
delete result;delete [] subimg;
delete [] subimgres;
MPI_Finalize();�� ������������������� 4 ���� 2 ������
������������������RGB ������������������������
�����CPU ������ GPU ���������������� GPU ������ CPU→GPU��������������CPU ���������������������
��������������������GPU �������������
�����������
������������������������������� 40960 × 40960 ��������
����1 �����������������������������������1 �����
�������������� GPU ��������������������������MPI �������������������

4��������CX400 ��������������Intel �������� GPGPU ���������
��������������
���������������������������������

53������ ���������� � 27 � 2015.3

��� 4: ���� (RGB→ ������� sec)

��

���

���

���

CX400(CPU)CX400(K20m)
PC(CPU)
PC(GTX780)
CX400(CPU)CX400(K20m)
PC(CPU)
PC(GTX780)
CX400(CPU)CX400(K20m)
PC(CPU)
PC(GTX780)
CX400(CPU)CX400(K20m)
PC(CPU)
PC(GTX780)

5,120
5,120
5,120
5,120
10,240
10,240
10,240
10,24020,48020,48020,48020,48040,96040,96040,96040,960

5,120
5,120
5,120
5,120
10,240
10,240
10,240
10,24020,48020,48020,48020,48040,96040,96040,96040,96026,214,400
26,214,400
26,214,400
26,214,400
104,857,600
104,857,600
104,857,600
104,857,600
419,430,400
419,430,400
419,430,400
419,430,400
1,677,721,600
1,677,721,600
1,677,721,600
1,677,721,600

1node
0.093370.25050.046
0.157
0.38340.35060.172
0.26601.525
0.81971.280
0.7030
����
����
����
����

2nodes
0.046150.2282
N/A
N/A
0.19030.2967N/A
N/A
0.75880.5635
N/A
N/A
3.010
1.377
N/A
N/A

4nodes
0.02252
0.217
N/A
N/A
0.094510.2495
N/A
N/A
0.38200.3818
N/A
N/A
1.523
0.7828N/A
N/A

8nodes
0.010900.2076
N/A
N/A
0.04683
0.2252
N/A
N/A
0.19000.2958N/A
N/A
0.75830.5112
N/A
N/A

16nodes0.005795
0.2065
N/A
N/A
0.023500.2134
N/A
N/A
0.09401
0.2443
N/A
N/A
0.38150.3448
N/A
N/A���������
�OpenCV � Intel ��������������������������� GPGPU�����������������
�CUDA � Intel MPI �����������������
��������������������������������������������������CX400 �������MPI ������������ GPGPU �������������
�������������������������������������������
����������������������������������������������
������� res-system � isc.kyutech.ac.jp �������������

����[1] �������������� ������������http://www2.cc.kyushu-u.ac.
jp/scp/system/general/CX/how to use/[2] Intel Developer Zone�Intel Compilers�
https://software.intel.com/en-us/intel-compilers[3] NVIDIA CUDA Zone�https://developer.nvidia.com/cuda-zone[4] OPENCV�Open Source Computer Vision�http://opencv.org/[5] NVIDIA Tesla Server Solutions�http://www.nvidia.com/object/tesla-servers.html[6] Message Passing Interface Forum�http://www.mpi-forum.org/[7] � ���PC ����������������������������������� �
22 ��http://www.isc.kyutech.ac.jp/kouhou/kouho22/pdf/koho22-kaisetu3.
pdf�2010������ ���������� � 27 � 2015.3

54

��

5120x5120

処理時間(sec)
0.3

20480x20480

処理時間(sec)
1.8
1.6

0.25

1.4

0.2

1.2
1

0.15

0.8

0.1

0.6
0.4

0.05

0.2

0

0
0

2

4

6

CX400(CPU)8

10CX400(K20m)

1214

PC(CPU)

16

18
ノード数
PC(GTX780)

10240x10240

処理時間(sec)
0.45

0

2

4

6

CX400(CPU)

10

12

14

16
18
ノード数
PC(GTX780)

14

16
18
ノード数
PC(GTX780)

PC(CPU)40960x40960

処理時間(sec)
3.5

0.4

8
CX400(K20m)

3

0.35

2.5

0.3
0.25

2

0.2

1.5

0.15

1

0.1

0.5

0.05
0

0
0

2

4

CX400(CPU)68CX400(K20m)

1012PC(CPU)

14

16

18
ノード数
PC(GTX780)

0

2

4

CX400(CPU)

6

8

10

CX400(K20m)

12PC(CPU)� 2: ���� (RGB→ ����)55������ ���������� � 27 � 2015.3