Существует ли удобный и эффективный способ использования стандартного контейнера API cpp в соответствии с требованиями NUMA?
Я хотел бы сделать OpenMP параллельное разреженное матричное векторное умножение в среде cpp.
Чтобы выделить и инициализировать значения вектора и матрицы в отношении доменов NUMA, код C будет выглядеть так:
size_t N = 1000000;
double* vecVal = malloc (N*sizeof(double));
#pragma OMP parallel for
for (size_i=0; i<N; ++i)
{
vecVal[i] = 0.;
}
/* do spMV */
delete vecVal;
В Cpp я хотел бы использовать std :: vector (std :: array с фиксированным размером тоже хорошо).
Срабатывает ли std :: vector :: reserve ()?
Законно ли делать что-то вроде этого:
std::vector<double> vec;
vec.reserve(N);
double *vecVal = vec.data();
#pragma OMP parallel for
for (size_i=0; i<N; ++i)
{
vecVal[i] = 0.;
}
/* do spMV */
Как я могу впоследствии установить правильный размер для std :: vector?
Кто-нибудь знает более элегантный способ?
Вы должны использовать специальный распределитель с поддержкой Numa здесь. Мы реализовали что-то вроде этого для HPX здесь: https://github.com/STEllAR-GROUP/hpx/blob/master/hpx/parallel/util/numa_allocator.hpp
Основная идея состоит в том, чтобы иметь первое прикосновение внутри функции выделения распределителей. замените материал исполнителя HPX на ваш #omp parallel for schedule(static)
цикл, и вы должны быть в порядке.
Других решений пока нет …