8 Mart 2018 Perşembe

compute

Giriş
Şu satırı dahil ederiz.
#include <boost/compute.hpp>
Rahat kullanmak için şöyle yaparız. OpenCL ile linklemek gerekir.
namespace compute = boost::compute;
Açıklaması şöyle.
boost:compute functions are not OpenCL kernel functions. They are more like OpenGL kernel functions.
boost compute yerine kendi OpenCL kütüphanemizi geliştirmek mümkün.
command_queue Sınıfı
Giriş
Bir device içinde kernel vardır. Kernel işleri çalıştırır. Uygulamanın kernel'e iş ataması için command_queue sınıfına ihtiyacı vardır.

enqueue_1d_range_kernel metodu
Şöyle yaparız.
kernel.set_arg(0, values.get_buffer());
kernel.set_arg(1, results.get_buffer());
kernel.set_arg(2, &constant);
queue.enqueue_1d_range_kernel(kernel, 0, count, 0);
context Sınıfı
Constructor
Örnek
Şöyle yaparız.
compute::device gpu = ...;

// create a compute context and command queue
compute::context ctx (gpu);
Örnek
Şöyle yaparız.
compute::device gpu = compute::system::default_device();

// create a compute context and command queue
compute::context ctx (gpu);

copy metodu
Host ve device arasında bellek kopyalar.
Örnek
Şöyle yaparız.
std::vector<float> host_vector = ...;
compute::vector<float> device_vector (...,...);
compute::command_queue queue = (...,...);

// copy data to the device
compute::copy(
  host_vector.begin(), host_vector.end(), device_vector.begin(), queue
);
copy_if metodu
Şu satırı dahil ederiz.
#include <boost/compute/algorithm/copy_if.hpp>
Kolay kullanmak için şöyle yaparız.
using namespace boost::compute;
Host ve device arasında bellek kopyalar.
Örnek
Elimizde şöyle bir mask olsun.
mask = [0 0 0 1 1 0 1 0 1]
Şöyle yaparız.
detail::copy_index_if (mask.begin(), mask.end(), inds.begin(), _1 == 1, queue);
default_random_engine Sınıfı
Device üzerinde çalışan rastgelen sayı üretecidir.

device Sınıfı
Constructor
Şöyle yaparız.
// get the default compute device
compute::device gpu = compute::system::default_device();

queue Sınıfı
Constructor
Şöyle yaparız.
compute::device gpu  = ...;
compute::context ctx = ...
compute::command_queue queue (ctx, gpu);
reduce_by_key metodu
Şöyle yaparız.
boost::compute::vector<int> keys_output = ...;
boost::compute::vector<int> values_output = ...;

boost::compute::reduce_by_key(
    boost::compute::make_transform_iterator(
      boost::compute::make_counting_iterator<int>(0),
      boost::compute::_1 / 100
    ),
    boost::compute::make_transform_iterator(
      boost::compute::make_counting_iterator<int>(values_input.size()),
      boost::compute::_1 / 100
    ),
    values_input.begin(),
    keys_output.begin(), 
    values_output.begin(),
    queue
 );
sort metodu
Device üzerinde sort işlemi yapar. Şöyle yaparız.
compute::vector<float> device_vector (...,...);
compute::command_queue queue = (...,...);

// sort data on the device
compute::sort(
  device_vector.begin(), device_vector.end(), queue
);
transform metodu
Device üzerinde transform işlemi yapar.Şöyle yaparız.
using namespace boost::compute::lambda;

float c = 1.234; // some constant

boost::compute::transform(values.begin(), values.end() -1, // values0
                          values.begin() +1, // values1
                          results.begin(), // results
                          _1 + _2 + c, queue);
vector Sınıfı
Giriş
Vector sınıfı context'i bilir. Bu sayede hangi device üzerinde çalıştığını bilir.
Constructor
Şöyle yaparız.
compute::context ctx = ...;
// create vector on the device
compute::vector<float> device_vector (1000000, ctx);
begin metodu
Örnek ver

end metodu
Örnek ver


Hiç yorum yok:

Yorum Gönder