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

#c #sycl

#c #sycl

Вопрос:

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

 template <typename T>
void MatrixMulParallelNaive(queueamp; q, 
    std::vector<std::vector<T>>amp; a,
    std::vector<std::vector<T>>amp; b,
    std::vector<std::vector<T>>amp; 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::vector s

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

Ответ №1:

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

Комментарии:

1. Вы имеете в виду, что я сглаживаю 2D-вектор и обращаюсь к нему как к линейному блоку памяти?

2. @KaranShan да. data(x,y) := vec[x y*cols] . Вы также должны проверить, что происходит с шагом. Обычно изображения и тому подобное имеют высоту, ширину и шаг в качестве параметров, и поэтому я считаю buffer<T,2> , что они также должны иметь один.