Создание буфера в SYCL для 2D std::vector

Как правильно создать 2D-буфер std::vector в SYCL? У меня есть функция шаблона, которая получает аргументы, как показано ниже:

template <typename T>
void MatrixMulParallelNaive(queue& q, 
    std::vector<std::vector<T>>& a,
    std::vector<std::vector<T>>& b,
    std::vector<std::vector<T>>& c){ 
    
    // Is this a correct way?
    buffer<T, 2> a_buf(a.data(), range<2>{a.size(), a[0].size()})
    buffer<T, 2> b_buf(b.data(), range<2>{b.size(), b[0].size()})
    buffer<T, 2> c_buf(c.data(), range<2>{c.size(), c[0].size()})
    
    /* ... */
}

a, b и c являются 2D std::vectors

Мне удалось реализовать буферы для 2D-массивов в стиле C, но я пробовал несколько документов и ответов, но, похоже, ни один из них не соответствует этому конкретному варианту использования.


person Karan Shah    schedule 18.10.2020    source источник


Ответы (1)


vector<vector<T>> не создает непрерывный блок памяти. Вам нужно использовать vector<T> и интерпретировать его как двумерный блок данных.

person ALX23z    schedule 18.10.2020
comment
Вы имеете в виду, что я сглаживаю 2D-вектор и получаю доступ как к линейному блоку памяти? - person Karan Shah; 18.10.2020
comment
@КаранШан, да. data(x,y) := vec[x+y*cols]. Вы также должны проверить, что происходит с шагом. Обычно изображения и тому подобное имеют высоту, ширину и шаг в качестве параметров, и поэтому я считаю, что buffer<T,2> также должен иметь один. - person ALX23z; 18.10.2020