2017-01-16 14 views
5

Tôi hiện đang khám phá boost_compute. Thật không may là có ít trang tài liệu và ví dụ hơn là tôi cần phải hiểu phải làm gì.Làm cách nào để gọi hàm boost_compute 'BOOST_COMPUTE_FUNCTION'?

Với mã được rút gọn như sau:

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

Làm thế nào để gọi 'thêm' chức năng và biến iterating bên trong của chức năng này là những gì? Hơn nữa tôi cần cấu trúc mã này để thực hiện phép tính phức tạp hơn.

Kind Regards, Toni

+0

Sử dụng 'tính toán :: transform', như trong ví dụ ở đây: 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

Một hàm trong boost :: compute được áp dụng cho một phần tử vector đơn. Những gì bạn có thể tìm kiếm là một hạt nhân tùy chỉnh. – ddemidov

+0

Thật không may là tôi không thể tưởng tượng việc gọi điện chuyển đổi đúng cách. Ví dụ này không trả lời cho tôi bất kỳ câu hỏi nào:/ – infotoni91

Trả lời

1

Trong boost:compute chức năng ngắn là khôngOpenCL chức năng hạt nhân. Chúng giống như OpenGL các hàm hạt nhân.

Tôi tin rằng chức năng của bạn có quá nhiều tham số được sử dụng với các thuật toán boost:compute.
Tuy nhiên, một chức năng hơi đơn giản, chỉ cần thêm giá trị liền kề mà không có sự liên tục, sẽ là:

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

Và có thể được gọi bằng boost::compute::transform như @ddemidov gợi ý:

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

Có thể để thực hiện chức năng của bạn bằng cách sử dụng các hàm boost::compute::lambda. ví dụ:

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

Nhưng nó vẫn thiếu một tập hợp các giá trị ...

Chức năng của bạn có thể được viết như một hạt nhân OpenCL trong boost:compute sử dụng BOOST_COMPUTE_STRINGIZE_SOURCE vĩ mô:

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

); 

Sau khi bạn đã xây dựng chương trình hạt nhân của bạn và tạo hạt nhân của bạn (sử dụng boost::compute::program), bạn có thể đặt riêng đối số hạt nhân và gọi hàm 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

Cảm ơn bạn rất nhiều! Thật không may là lời gọi đến 'clCreateKernel' trong kernel.hpp dẫn đến một hạt nhân rỗng đang ném một ngoại lệ. Đồng bằng OpenCL tuy nhiên hoạt động như một sự quyến rũ. – infotoni91

Các vấn đề liên quan