oneMKL サマリー統計利用モデル

oneMKL サマリー統計利用モデル#

説明#

乱数生成器の一般的なアルゴリズムは次のとおりです:

  1. データセットのオブジェクトを作成して初期化します。

  2. 適切な推定値を計算するため、サマリー統計ルーチンを呼び出します。

次の例は、乱数で満たされた 3 次元データセットの平均値を計算する方法を示しています。データセットの作成には、make_dataset ヘルパー関数が使用されます。

サマリー統計の利用例#

バッファー API#

#include <iostream> 
#include <vector> #include "CL/sycl.hpp" #include "oneapi/mkl/stats.hpp" 

int main() { 
    sycl::queue queue; 

    const size_t n_observations = 1000; 
    const size_t n_dims = 3; 
    std::vector<float> x(n_observations * n_dims); 
    // fill x storage with random numbers 
    for(int i = 0; i < n_dims, i++) { 
        for(int j = 0; j < n_observations; j++) { 
            x[j + i * n_observations] = float(std::rand()) / float(RAND_MAX); 
        } 
    } 
    //create buffer for dataset 
    sycl::buffer<float, 1> x_buf(x.data(), x.size()); 
    // create buffer for mean values 
    sycl::buffer<float, 1> mean_buf(n_dims); 
    // create mkl::stats::dataset 
    auto dataset = oneapi::mkl::stats::make_dataset<mkl::stats::layout::row_major>(n_dims, n_observations, x_buf); 

    oneapi::mkl::stats::mean(queue, dataset, mean_buf); 

    // create host accessor for mean_buf to print results 
    auto acc = mean_buf.template get_access<sycl::access::mode::read>(); 

    for(int i = 0; i < n_dims; i++) { 
        std::cout << "Mean value for dimension " << i << ": "<< acc[i]<< std::endl; 
    } 
    return 0; 
}

USM API#

#include <iostream> 
#include <vector> 

#include "CL/sycl.hpp" 
#include "oneapi/mkl/stats.hpp" 

int main() { 
    sycl::queue queue; 

    const size_t n_observations = 1000; 
    const size_t n_dims = 3; 

    sycl::usm_allocator<float, sycl::usm::alloc::shared> allocator(queue); 

    std::vector<float, decltype(allocator)> x(n_observations * n_dims, allocator); 
    // fill x storage with random numbers 
    for(int i = 0; i < n_dims, i++) { 
        for(int j = 0; j < n_observations; j++) { 
            x[j + i * n_observations] = float(std::rand()) / float(RAND_MAX); 
        } 
    } 
    std::vector<float, decltype(allocator)> mean_buf(n_dims, allocator); 
    // create mkl::stats::dataset 
    auto dataset = oneapi::mkl::stats::make_dataset<mkl::stats::layout::row_major>(n_dims, n_observations, x); 

    sycl::event event = oneapi::mkl::stats::mean(queue, dataset, mean); 
    event.wait(); 
    for(int i = 0; i < n_dims; i++) { 
        std::cout << "Mean value for dimension " << i << ": "<< mean[i]<< std::endl; 
    } 
    return 0; 
}

sycl::malloc_shared/malloc_device 関数を使用して、生のポインターで USM を使用することもできます。さらに、サマリー統計関数の使用方法を示す例は、以下で入手できます。

${MKL}/share/doc/mkl/examples/sycl/stats/source