第11章 ヒストグラム

目次

11.1. アルゴリズムのパラメータ
11.2. 共有ローカルメモリ
11.3. ストライドとメモリアクセス
11.4. ストライドとBank Conflict
11.5. Stride型のアルゴリズム
11.6. バンクコンフリクトを緩和する実装例
11.7. アトミック型のアルゴリズム

ヒストグラムは統計学の基本であり、データの分布状況を把握するために使います。データの分布を集計するには「階数」(横軸)を定義します。この階数の要素は、ビン(もしくはカテゴリ、バケツ)と呼びます。ビンを算出する式は以下の式で表せます。

images/normal_histogram.png

nはビン、mはデータの要素を示します。つまりk個のmの和がビンということです。

CPUでヒストグラムを実装するのは驚くほどシンプルです。下記のソースコードでは、ヒストグラムを集計している行はわずか1行です。

ヒストグラムの集計(CPU). 

package com.book.jocl.histogram;

import java.util.Random;

public class HistogramCPU {
        private static final int BIN_SIZE = 256;
        private static final int LOCAL_SIZE = 128;
        private static final int DATA_SIZE = BIN_SIZE * LOCAL_SIZE * 64;
        private static final int[] data = new int[DATA_SIZE];
        private static int[] histogram = new int[BIN_SIZE];

        public static void main(String[] args) {

                generateSample();

                for(int i = 0; i < DATA_SIZE; ++i) {
                        histogram[data[i]]++; //(1)
                }

                for(int i = 0; i < BIN_SIZE; ++i) {
                        System.out.println(histogram[i]);
                }
        }
        private static void generateSample() {
                Random rnd = new Random();
                for(int i = 0; i < DATA_SIZE; i++) {
                        data[i] = rnd.nextInt(256); //(2)
                }

        }
}

(1)

配列の添字をdata[i]として、該当する添字の要素をインクリメントします。

(2)

元データです。histogram配列は要素256のint型なので、0〜255の値を乱数生成します。

上記のプログラムの出力は以下のようになります。

出力. 

8070
8436
8147
8249
8201
...
8300
8128
8361

Copyright 2018-2019, by Masaki Komatsu