Контейнер Cpp с поддержкой NUMA

Существует ли удобный и эффективный способ использования стандартного контейнера 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?

Кто-нибудь знает более элегантный способ?

5

Решение

Вы должны использовать специальный распределитель с поддержкой Numa здесь. Мы реализовали что-то вроде этого для HPX здесь: https://github.com/STEllAR-GROUP/hpx/blob/master/hpx/parallel/util/numa_allocator.hpp

Основная идея состоит в том, чтобы иметь первое прикосновение внутри функции выделения распределителей. замените материал исполнителя HPX на ваш #omp parallel for schedule(static) цикл, и вы должны быть в порядке.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]