2017-01-16 107 views
5

我目前正在探索boost_compute。不幸的是,文檔頁面和示例較少,比我需要了解要做什麼。如何調用boost_compute'BOOST_COMPUTE_FUNCTION'定義的函數?

考慮下面的代碼縮小的:

BOOST_COMPUTE_FUNCTION(bool, add, (int* values, int* results, int constant), 
{ 
    // Whats the indexing variable? 
    // In opencl it would be get_global_id(0) 
    int index = // ? 

    results[index] = values[index] + values[index + 1] + values[index + 2] + constant; 
}); 

void compute(float* results, compute::context* ctx, compute::command_queue* queue) 
{ 
    compute::vector<float> device_values(100, *ctx); 
    compute::vector<float> device_results(98, *ctx); 

    compute::copy(
     parameters->values.begin(), parameters->values.end(), device_values.begin(), *queue 
    ); 

    // Actual computation 
    // HOW TO CALL 'add' for every device_results element? 

    compute::copy(
     device_results.begin(), device_results.end(), results, *queue 
    ); 
} 

如何調用「添加」功能,這是什麼函數內的迭代變量?此外,我需要這種代碼結構來進行更復雜的計算。

親切的問候, 託尼

+0

使用'計算:: transform',在這裏的例子:http://www.boost.org/doc/libs/1_63_0/libs/compute/doc/html/boost_compute/advanced_topics.html# boost_compute.advanced_topics.custom_functions – ddemidov

+0

boost :: compute中的函數應用於單個向量元素。你可能在尋找的是一個定製的內核。 – ddemidov

+0

不幸的是,我無法想象調用正確的方式進行轉換。這個例子沒有回答我任何問題:/ – infotoni91

回答

1

總之boost:compute功能OpenCL內核函數。它們更像是OpenGL內核函數。

我相信你的功能需要太多的參數才能用於boost:compute算法。
然而,稍微簡單的功能,只是增加相鄰值不恆定的,應該是:

BOOST_COMPUTE_FUNCTION(boost::compute::float_, add, 
         (boost::compute::float_ values0, boost::compute::float_ values1), 
{ 
    return values0 + values1; 
}); 

而且可以使用boost::compute::transform作爲@ddemidov建議被稱爲:

boost::compute::transform(values.begin(), values.end() -1, // values0 
          values.begin() +1, // values1 
          results.begin(), // results 
          add, queue); 

它可能會以使用boost::compute::lambda函數來實現您的功能。例如:

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); 

但它仍然是短一組值的...

你的函數可以在boost:compute使用被寫成一個OpenCL內核BOOST_COMPUTE_STRINGIZE_SOURCE宏:

const char kernel_function_source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(

    kernel void add(global float* values, global float* results, global float* constant) 
    { 
    size_t index = get_global_id(0); 
    results[index] = values[index] + values[index + 1] + values[index + 2] + *constant; 
    } 

); 

後您已經構建了內核程序並創建了內核(使用boost::compute::program),可以單獨設置內核參數並調用boost::compute::command_queueenqueue_1d_range_kernel函數:

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); 
+0

非常感謝!不幸的是,在kernel.hpp中對'clCreateKernel'的調用會導致一個空的內核拋出異常。然而,Plain OpenCL就像一個魅力。 – infotoni91