如何用C++数组初始化OpenCL常量向量?[主持人]

How to initialize OpenCL const vector with C++ array? [Host]

本文关键字:向量 主持人 常量 OpenCL 何用 C++ 数组 初始化      更新时间:2023-10-16

在我的类中,我有以下声明:

class OCLState {
    //Irrelevant stuff involving OpenCL contexts and command queues and so on...
    const cl_int16 values;
    OCLState(const std::array<int, 16> & _values);
}

所以自然地,当我创建这个对象时,我需要初始化向量。问题是,如何将_values转换为values将接受作为初始值设定项的形式?

OCLState::OCLState(const std::array<int, 16> & _values) : values(
{ _values[0], _values[1], _values[2], _values[3] , _values[4] , _values[5] , _values[6], _values[7],
_values[8], _values[9], _values[10], _values[11] , _values[12] , _values[13] , _values[14], _values[15] }
) {
    //Irrelevant stuff involving setting up contexts and queues and so forth
}

这是可行的,但它是极其繁琐和难以阅读。有更好的方法吗?

编辑:

OCLState::OCLState(const std::array<int, 16> & _values) : values(array_to_vector(_values)) {
}
cl_int16 OCLState::array_to_vector(const std::array<int, 16> & in) {
    cl_int16 out;
    for (int i = 0; i < 16; i++) out.s[i] = in[i];
    return out;
}

这也是可行的,但我认为这并不理想。我正在寻找一种不需要为我在编写这些程序时可能使用的每一个向量编写辅助方法的方法。

绕过这一问题而不必惊讶地放弃的一种方法是使用爱/恨的reinterpret_cast。你可以定义你的构造函数如下:

OCLState::OCLState(const std::array<int, 16> &_values) : 
    values(*reinterpret_cast<const cl_int16*>(&_values.front())) { }

产生所需行为:

int main(int argc, char *argv[]) {
    OCLState S({0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15});
    std::cout << S.values.s[0] << "," << S.values.s[15] << std::endl;
}

打印>0,15

use可以在构造函数主体中使用std::copy(include<algorithm>)

std::copy ( _values.begin(),_values.end(), &values.s[0]);

您必须通过从值中删除常量

或者将此代码封装在类似于辅助函数

的模板函数中