そしたら、boost::compute というのがあって、OpenCL を使えるらしいのです。
チュートリアルを macbook pro でコンパイルしてみたら動く感じだったんで、本当に速いのかチェックしてみました。
コンパイルは、brew install boost してある状態で、こんなん。
g++ tutorial3.cpp -I /usr/include -framework OpenCL -std=c++11 -lboost_timerチュートリアルを少し弄ってあります。
#include <vector> #include <algorithm> #include <boost/compute/algorithm/transform.hpp> #include <boost/compute/container/vector.hpp> #include <boost/compute/functional/math.hpp> #include <iostream> #include <cmath> #include <boost/timer/timer.hpp> namespace compute = boost::compute; int main() { // get default device and setup context compute::device device = compute::system::default_device(); compute::context context(device); compute::command_queue queue(context, device); std::vector<float> host_vector(100000000); boost::timer::cpu_timer timer; float n = 1.0f; std::generate(host_vector.begin(), host_vector.end(), [&n]() { return n += 1.0f; }); // generate random data on the host //std::generate(host_vector.begin(), host_vector.end(), rand); timer.start(); // create a vector on the device compute::vector<float> device_vector(host_vector.size(), context); // transfer data from the host to the device compute::copy( host_vector.begin(), host_vector.end(), device_vector.begin(), queue ); // calculate the square-root of each element in-place compute::transform( device_vector.begin(), device_vector.end(), device_vector.begin(), compute::sqrt<float>(), queue ); // copy values back to the host compute::copy( device_vector.begin(), device_vector.end(), host_vector.begin(), queue ); timer.stop(); std::cout << "GPU: " << timer.format() << std::endl; n = 1.0f; std::generate(host_vector.begin(), host_vector.end(), [&n]() { return n += 1.0f; }); std::sqrt<float>(n); timer.start(); std::transform( host_vector.begin(), host_vector.end(), host_vector.begin(), static_cast<float (*)(float)>(std::sqrt)); timer.stop(); std::cout << "CPU: " << timer.format() << std::endl; //for( float x: host_vector) { std::cout << x << ","; } return 0; }元は 10000 個の配列演算だったんですが、それだと
GPU: 0.078395s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%) CPU: 0.000097s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)メモリ転送の処理に時間がかかって効果を確認できず。
100000000 個の配列演算で比較すると
GPU: 0.367576s wall, 0.000000s user + 0.170000s system = 0.170000s CPU (46.2%) CPU: 0.819997s wall, 0.820000s user + 0.000000s system = 0.820000s CPU (100.0%)ようやく効果が確認できました。
追記: host_vector size が 1000000000 -> 100000000 に訂正しました
0 件のコメント:
コメントを投稿