#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>
, что они также должны иметь один.