5

Есть ли удобный и эффективный способ использования стандартного API-интерфейса cpp в режиме NUMA?NUMA aware Cpp Container

Я хотел бы сделать параллельное разреженное умножение векторной матрицы 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 :: массив фиксированный размер также хорошо). Есть ли 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 */ 

Как я могу после этого установить правильный размер в станд :: вектор?

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

+1

resize() не является NUMA, так как он инициализирует все значения в одном домене NUMA (первый штрих) – Titzi

+0

Является ли особой вещью для кода NUMA для «удаления» памяти malloc? –

ответ

3

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

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