SlideShare a Scribd company logo
1 of 45
100倍をぶち殺せたらいいな
関東GPGPU勉強会 #2
山田てるみ
自己紹介
• 山田てるみ
• @telmin_orca
• なんちゃってGPUプログラマ
2012∼2013
2012∼2013
• Fermi -> Kepler
http://en.wikipedia.org/wiki/File:Nvidia_logo.svg
http://www.nvidia.co.jp/page/home.html
2012∼2013
• GCN Architecture
Mali
OpenCL
2012∼2013
2010
Debunking the
100X GPU vs. CPU
Myth
GPUが100倍速いという神話をぶち殺す
3 years later...
あれから3年が過ぎた…
NVIDIA
• Kepler Architecture
• GK110
• SM -> SMX
• 32(48) -> 192!!
• 1.03TFLOPS -> 3.5TFLOPS!!
の造りし          
     も
                    の
M
  I
C  、襲来
Xeon Phi
• MIC Architecture
• 60 Core / 4 Threads
• 32KB / L1 cache
• 512KB / L2 cache
• 512-bit vector unit!
Debunking the
100X GPU vs. CPU
Myth? ver.2013
大事なこと
• 以下の測定結果にはHost <->device間の
データ転送時間は含まれていません
• 元論文に準拠しました
• Haswellのデータも追加しました
SAXPY
• y = Ax+y
• かけてたす
• 演算量少なすぎてメモリ律速
SAXPY
• 実験条件
• 要素数:10000000
SAXPY
void	
  simpleSaxpy(double*	
  x,	
  double*	
  y,	
  const	
  double	
  A,	
  
const	
  size_t	
  num)
{
	
  	
  	
  	
  for(size_t	
  i	
  =	
  0;	
  i	
  <	
  num;	
  ++i)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  y[i]	
  =	
  a	
  *	
  x[i]	
  +	
  y[i];
	
  	
  	
  	
  }
}
SAXPY OpenMP +
AVX
void	
  avxSaxpy(const	
  double*	
  x,	
  double*	
  y,	
  const	
  double	
  a,	
  const	
  size_t	
  num)
{
	
  	
  	
  	
  __m256d	
  v_a	
  =	
  _mm256_set1_pd(a);
#pragma	
  omp	
  parallel	
  for
	
  	
  	
  	
  for(int	
  i	
  =	
  0	
  ;	
  i	
  <	
  num	
  /	
  4;	
  ++i)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  __m256d	
  v_x0	
  =	
  _mm256_loadu_pd(&x[i	
  *	
  4]);
	
  	
  	
  	
  	
  	
  	
  	
  __m256d	
  v_y0	
  =	
  _mm256_loadu_pd(&y[i	
  *	
  4]);
	
  
	
  	
  	
  	
  	
  	
  	
  	
  __m256d	
  v01	
  =	
  _mm256_mul_pd(v_a,	
  v_x0);
	
  	
  	
  	
  	
  	
  	
  	
  __m256d	
  v02	
  =	
  _mm256_add_pd(v01,	
  v_y0);
	
  
	
  	
  	
  	
  	
  	
  	
  	
  _mm256_storeu_pd(&y[i	
  *	
  4],	
  v02);
	
  	
  	
  	
  }
}
SAXPY CUDA
__global__	
  void
cudaSaxpyKernel(const	
  double*	
  x,	
  double*	
  y,	
  const	
  double	
  a,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  int	
  num_elements)
{	
  	
  	
  
	
  	
  	
  	
  const	
  int	
  id	
  =	
  blockDim.x	
  *	
  blockIdx.x	
  +	
  threadIdx.x;
	
  
	
  	
  	
  	
  if(id	
  <	
  num_elements)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  y[id]	
  =	
  a	
  *	
  x[id]	
  +	
  y[id];
	
  	
  	
  	
  }
}
SAXPY MIC
void	
  micSaxpy(const	
  double*	
  x,	
  double*	
  y,	
  const	
  double	
  a,	
  const	
  size_t	
  num)
{
	
  	
  	
  	
  __m512d	
  v_a	
  =	
  _mm512_set1_pd(a);
	
  
#pragma	
  omp	
  parallel	
  for
	
  	
  	
  	
  for(int	
  i	
  =	
  0;	
  i	
  <	
  num	
  /	
  8;	
  ++i)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  __m512d	
  v_x	
  =	
  _mm512_load_pd(&x[i	
  *	
  8]);
	
  	
  	
  	
  	
  	
  	
  	
  __m512d	
  v_y	
  =	
  _mm512_load_pd(&y[i	
  *	
  8]);
	
  
	
  	
  	
  	
  	
  	
  	
  	
  __m512d	
  res	
  =	
  _mm512_fmadd_pd(v_x,	
  v_a,	
  v_y);
	
  	
  	
  	
  	
  	
  	
  	
  _mm512_storenr_pd(&y[i	
  *	
  8],	
  res);
	
  	
  	
  	
  }
}
SAXPY
msec GFlops GB/s
Corei7
2600K
14.077 1.42071 17.0486
Corei7
4770K
12.448 1.606 19.279
Titan 0.134 141.461 848.763
XeonPhi 1.98 10.095 121.15
Histogram
• ヒストグラム
Histogram
Histogram
• 実験条件
• 1920x1080画像
• bin: 256
Histogram
void	
  simpleHistogram(const	
  unsigned	
  char*	
  src,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  std::vector<int>&	
  dst,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  size_t	
  width,	
  const	
  size_t	
  height)
{
	
  	
  	
  	
  //	
  grayscale
	
  	
  	
  	
  for(size_t	
  y	
  =	
  0;	
  y	
  <	
  height;	
  ++y)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  x	
  =	
  0;	
  x	
  <	
  width;	
  ++x)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  unsigned	
  char	
  val	
  =	
  src[y	
  *	
  width	
  +	
  x];
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dst[val]++;
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
}
Histogram OpenMP
void	
  openMPHistogram(const	
  unsigned	
  char*	
  src,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  std::vector<int>&	
  dst,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  size_t	
  width,	
  const	
  size_t	
  height)
{
#pragma	
  omp	
  parallel
	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  std::vector<int>	
  local_dst(256);
#pragma	
  omp	
  for
	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  y	
  =	
  0;	
  y	
  <	
  height;	
  ++y)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  x	
  =	
  0;	
  x	
  <	
  width;	
  ++x)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  unsigned	
  char	
  val	
  =	
  src[y	
  *	
  width	
  +	
  x];
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  local_dst[val]++;
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  }
#pragma	
  omp	
  critical
	
  	
  	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  i	
  =	
  0;	
  i	
  <	
  256;	
  ++i)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dist[i]	
  +=	
  local_dist[i];
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
}
Histogram CUDA
__global__	
  void
histogram_cuda_kernel(const	
  unsigned	
  char*	
  src,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  int*	
  dst,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  unsigned	
  int	
  width,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  unsigned	
  int	
  height,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  unsigned	
  int	
  num_elements)
{
	
  	
  	
  	
  int	
  idx	
  =	
  blockDim.x	
  *	
  blockIdx.x	
  +	
  threadIdx.x;
	
  	
  	
  	
  int	
  x	
  =	
  idx	
  %	
  width;
	
  	
  	
  	
  int	
  y	
  =	
  idx	
  /	
  width;
	
  
	
  	
  	
  	
  if(idx	
  <	
  num_elements)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  unsigned	
  char	
  val	
  =	
  src[y	
  *	
  width	
  +	
  x];
	
  	
  	
  	
  	
  	
  	
  	
  atomicAdd(&dst[val],	
  1);
	
  	
  	
  	
  }
}
Histogram
msec MPixel / s
Corei7 2600K 0.734 2823.8
Corei7 4770K 0.273 3370.66
Titan 0.0816 25381.3
XeonPhi 117.5 17.6463
Histogram MIC
void	
  micHistogram_240(const	
  unsigned	
  char*	
  src,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  int*	
  dst,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  const	
  size_t	
  width,	
  const	
  size_t	
  height)
{
#pragma	
  omp	
  parallel	
  num_threads(240)
	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  const	
  size_t	
  thread_id	
  =	
  omp_get_thread_num();
	
  	
  	
  	
  	
  	
  	
  	
  const	
  size_t	
  num_threads	
  =	
  omp_get_num_threads();
	
  
	
  	
  	
  	
  	
  	
  	
  	
  size_t	
  local_height	
  =	
  height	
  /	
  num_threads;
	
  	
  	
  	
  	
  	
  	
  	
  local_height	
  +=	
  (thread_id	
  %	
  2)?	
  0	
  :	
  1;
	
  	
  	
  	
  	
  	
  	
  	
  const	
  size_t	
  offset	
  =	
  5	
  *	
  thread_id	
  -­‐	
  (thread_id	
  /	
  2);
	
  
	
  	
  	
  	
  	
  	
  	
  	
  std::vector<int>	
  local_dst(256);
	
  	
  	
  	
  	
  	
  	
  	
  std::vector<unsigned	
  char>	
  local_src(local_height	
  *	
  width);
	
  
	
  	
  	
  	
  	
  	
  	
  	
  memcpy(&local_src[0],	
  &src[offset	
  *	
  width],	
  sizeof(unsigned	
  char)	
  *	
  local_height	
  *	
  width);
	
  
	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  y	
  =	
  0;	
  y	
  <	
  local_height;	
  ++y)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  x	
  =	
  0;	
  x	
  <	
  width;	
  ++x)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  size_t	
  val	
  =	
  local_src[y	
  *	
  width	
  +	
  x];
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  local_dst[val]++;
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  
	
  	
  	
  	
  	
  	
  	
  	
  #pragma	
  omp	
  critical
	
  	
  	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  for(size_t	
  i	
  =	
  0;	
  i	
  <	
  256;	
  ++i)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dst[i]	
  +=	
  local_dst[i];
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
}
Histogram
msec MPixel / s
Corei7 2600K 0.734 2823.8
Corei7 4770K 0.273 3370.66
Titan 0.0816 25381.3
XeonPhi 2.074 999.806
NL-means
• Non-local Algorithm
• A non-local algorithm for image denoising
• http://bengal.missouri.edu/~kes25c/nl2.pdf
• バイラテラルフィルタの親戚
NL-means
• エッジキープ型のフィルタ
• ノイズを除去しつつもボケにくい!
• Aviutilとかにプラグインがある
NL-means
http://opencv.jp/opencv2-x-samples/non-local-means-filter
by fukushima1981.
NL-means
NL-means
• 実験条件
• 1920x1080画像
• Window size : 7x7
• Template size : 3x3
NL-means
sec FPS
Corei7 2600K 2.086 0.479
Corei7 4770K 2.29 0.436
Titan 0.05826 17.16
XeonPhi 1.217 0.822
Aobench
• Ambient Occlution
• 前回もやった
• Intelもサンプルに
使用
http://software.intel.com/en-us/articles/data-and-thread-parallelism/
Aobench
• 実験条件
• 512x512画像
• NSUBSAMPLE: 2
• NTHETA: 16
• NPHI: 16
Aobench
sec FPS
Corei7 2600K 1.556 0.642
Corei7 4770K 1.448 0.6905
Titan 0.0162 61.71
XeonPhi 0.9 1.11
0.00%$
2000.00%$
4000.00%$
6000.00%$
8000.00%$
10000.00%$
12000.00%$
SAXPY$ Histogram$ NL:means$ Aobench$
Core$i7$2600K$
Core$i7$4770K$
Titan$
XeonPhi$
結論
• CPUがGPUを倒す未来は
      もう少し先の物語…
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013

More Related Content

What's hot

すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
 

What's hot (20)

フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 

Viewers also liked

30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座
Sakiyama Kei
 

Viewers also liked (11)

Word2vecで大谷翔平の二刀流論争に終止符を打つ!
Word2vecで大谷翔平の二刀流論争に終止符を打つ!Word2vecで大谷翔平の二刀流論争に終止符を打つ!
Word2vecで大谷翔平の二刀流論争に終止符を打つ!
 
AAをつくろう!
AAをつくろう!AAをつくろう!
AAをつくろう!
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data science
 
Data Science Bowl 2017 Winning Solutions Survey
Data Science Bowl 2017Winning Solutions SurveyData Science Bowl 2017Winning Solutions Survey
Data Science Bowl 2017 Winning Solutions Survey
 
30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座
 
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
 
Quoraコンペ参加記録
Quoraコンペ参加記録Quoraコンペ参加記録
Quoraコンペ参加記録
 
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entriesIcml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
 
Scikit learnで学ぶ機械学習入門
Scikit learnで学ぶ機械学習入門Scikit learnで学ぶ機械学習入門
Scikit learnで学ぶ機械学習入門
 
IIBMP2016 深層生成モデルによる表現学習
IIBMP2016 深層生成モデルによる表現学習IIBMP2016 深層生成モデルによる表現学習
IIBMP2016 深層生成モデルによる表現学習
 
猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder
 

Similar to GPUが100倍速いという神話をぶち殺せたらいいな ver.2013

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
Kiwamu Okabe
 

Similar to GPUが100倍速いという神話をぶち殺せたらいいな ver.2013 (20)

Slide
SlideSlide
Slide
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
 
Intel AVX2を使用したailia sdkの最適化
Intel AVX2を使用したailia sdkの最適化Intel AVX2を使用したailia sdkの最適化
Intel AVX2を使用したailia sdkの最適化
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
自作LSIコミュニティの可能性
自作LSIコミュニティの可能性自作LSIコミュニティの可能性
自作LSIコミュニティの可能性
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
HalideでつくるDomain Specific Architectureの世界
HalideでつくるDomain Specific Architectureの世界HalideでつくるDomain Specific Architectureの世界
HalideでつくるDomain Specific Architectureの世界
 

Recently uploaded

Recently uploaded (11)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

GPUが100倍速いという神話をぶち殺せたらいいな ver.2013

  • 2. 自己紹介 • 山田てるみ • @telmin_orca • なんちゃってGPUプログラマ
  • 4. 2012∼2013 • Fermi -> Kepler http://en.wikipedia.org/wiki/File:Nvidia_logo.svg http://www.nvidia.co.jp/page/home.html
  • 8. Debunking the 100X GPU vs. CPU Myth GPUが100倍速いという神話をぶち殺す
  • 10. NVIDIA • Kepler Architecture • GK110 • SM -> SMX • 32(48) -> 192!! • 1.03TFLOPS -> 3.5TFLOPS!!
  • 11.
  • 12. の造りし                も                    の
  • 13.
  • 15. Xeon Phi • MIC Architecture • 60 Core / 4 Threads • 32KB / L1 cache • 512KB / L2 cache • 512-bit vector unit!
  • 16. Debunking the 100X GPU vs. CPU Myth? ver.2013
  • 18. SAXPY • y = Ax+y • かけてたす • 演算量少なすぎてメモリ律速
  • 20. SAXPY void  simpleSaxpy(double*  x,  double*  y,  const  double  A,   const  size_t  num) {        for(size_t  i  =  0;  i  <  num;  ++i)  {                y[i]  =  a  *  x[i]  +  y[i];        } }
  • 21. SAXPY OpenMP + AVX void  avxSaxpy(const  double*  x,  double*  y,  const  double  a,  const  size_t  num) {        __m256d  v_a  =  _mm256_set1_pd(a); #pragma  omp  parallel  for        for(int  i  =  0  ;  i  <  num  /  4;  ++i)  {                __m256d  v_x0  =  _mm256_loadu_pd(&x[i  *  4]);                __m256d  v_y0  =  _mm256_loadu_pd(&y[i  *  4]);                  __m256d  v01  =  _mm256_mul_pd(v_a,  v_x0);                __m256d  v02  =  _mm256_add_pd(v01,  v_y0);                  _mm256_storeu_pd(&y[i  *  4],  v02);        } }
  • 22. SAXPY CUDA __global__  void cudaSaxpyKernel(const  double*  x,  double*  y,  const  double  a,                                const  int  num_elements) {              const  int  id  =  blockDim.x  *  blockIdx.x  +  threadIdx.x;          if(id  <  num_elements)  {                y[id]  =  a  *  x[id]  +  y[id];        } }
  • 23. SAXPY MIC void  micSaxpy(const  double*  x,  double*  y,  const  double  a,  const  size_t  num) {        __m512d  v_a  =  _mm512_set1_pd(a);   #pragma  omp  parallel  for        for(int  i  =  0;  i  <  num  /  8;  ++i)  {                __m512d  v_x  =  _mm512_load_pd(&x[i  *  8]);                __m512d  v_y  =  _mm512_load_pd(&y[i  *  8]);                  __m512d  res  =  _mm512_fmadd_pd(v_x,  v_a,  v_y);                _mm512_storenr_pd(&y[i  *  8],  res);        } }
  • 24. SAXPY msec GFlops GB/s Corei7 2600K 14.077 1.42071 17.0486 Corei7 4770K 12.448 1.606 19.279 Titan 0.134 141.461 848.763 XeonPhi 1.98 10.095 121.15
  • 28. Histogram void  simpleHistogram(const  unsigned  char*  src,                                          std::vector<int>&  dst,                                          const  size_t  width,  const  size_t  height) {        //  grayscale        for(size_t  y  =  0;  y  <  height;  ++y)  {                for(size_t  x  =  0;  x  <  width;  ++x)  {                        unsigned  char  val  =  src[y  *  width  +  x];                        dst[val]++;                }        } }
  • 29. Histogram OpenMP void  openMPHistogram(const  unsigned  char*  src,                                          std::vector<int>&  dst,                                          const  size_t  width,  const  size_t  height) { #pragma  omp  parallel        {                std::vector<int>  local_dst(256); #pragma  omp  for                for(size_t  y  =  0;  y  <  height;  ++y)  {                        for(size_t  x  =  0;  x  <  width;  ++x)  {                                unsigned  char  val  =  src[y  *  width  +  x];                                local_dst[val]++;                        }                } #pragma  omp  critical                {                        for(size_t  i  =  0;  i  <  256;  ++i)  {                                dist[i]  +=  local_dist[i];                        }                }        } }
  • 30. Histogram CUDA __global__  void histogram_cuda_kernel(const  unsigned  char*  src,                                            int*  dst,                                            const  unsigned  int  width,                                            const  unsigned  int  height,                                            const  unsigned  int  num_elements) {        int  idx  =  blockDim.x  *  blockIdx.x  +  threadIdx.x;        int  x  =  idx  %  width;        int  y  =  idx  /  width;          if(idx  <  num_elements)  {                unsigned  char  val  =  src[y  *  width  +  x];                atomicAdd(&dst[val],  1);        } }
  • 31. Histogram msec MPixel / s Corei7 2600K 0.734 2823.8 Corei7 4770K 0.273 3370.66 Titan 0.0816 25381.3 XeonPhi 117.5 17.6463
  • 32. Histogram MIC void  micHistogram_240(const  unsigned  char*  src,                                            int*  dst,                                            const  size_t  width,  const  size_t  height) { #pragma  omp  parallel  num_threads(240)        {                const  size_t  thread_id  =  omp_get_thread_num();                const  size_t  num_threads  =  omp_get_num_threads();                  size_t  local_height  =  height  /  num_threads;                local_height  +=  (thread_id  %  2)?  0  :  1;                const  size_t  offset  =  5  *  thread_id  -­‐  (thread_id  /  2);                  std::vector<int>  local_dst(256);                std::vector<unsigned  char>  local_src(local_height  *  width);                  memcpy(&local_src[0],  &src[offset  *  width],  sizeof(unsigned  char)  *  local_height  *  width);                  for(size_t  y  =  0;  y  <  local_height;  ++y)  {                        for(size_t  x  =  0;  x  <  width;  ++x)  {                                size_t  val  =  local_src[y  *  width  +  x];                                local_dst[val]++;                        }                }                  #pragma  omp  critical                {                        for(size_t  i  =  0;  i  <  256;  ++i)  {                                dst[i]  +=  local_dst[i];                        }                }        } }
  • 33. Histogram msec MPixel / s Corei7 2600K 0.734 2823.8 Corei7 4770K 0.273 3370.66 Titan 0.0816 25381.3 XeonPhi 2.074 999.806
  • 34. NL-means • Non-local Algorithm • A non-local algorithm for image denoising • http://bengal.missouri.edu/~kes25c/nl2.pdf • バイラテラルフィルタの親戚
  • 38. NL-means • 実験条件 • 1920x1080画像 • Window size : 7x7 • Template size : 3x3
  • 39. NL-means sec FPS Corei7 2600K 2.086 0.479 Corei7 4770K 2.29 0.436 Titan 0.05826 17.16 XeonPhi 1.217 0.822
  • 40. Aobench • Ambient Occlution • 前回もやった • Intelもサンプルに 使用 http://software.intel.com/en-us/articles/data-and-thread-parallelism/
  • 41. Aobench • 実験条件 • 512x512画像 • NSUBSAMPLE: 2 • NTHETA: 16 • NPHI: 16
  • 42. Aobench sec FPS Corei7 2600K 1.556 0.642 Corei7 4770K 1.448 0.6905 Titan 0.0162 61.71 XeonPhi 0.9 1.11