2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Выделение памяти для многопоточной функции
Сообщение14.05.2024, 21:02 


15/12/22
198
Функция имеет такой прототип:
Используется синтаксис C
int calc_power(double* X, int* ind, int* lims, int N, int* id, double* M, double* R)
 

первые 4 параметра формируются в самом начале и на всём протяжении работы программы не меняются,
вообще, их можно сделать глобальными, но даст ли это преимущество в скорости или только внесёт путаницу?

более важный вопрос касается id, M, и R. Они меняются внутри функции и используются для хранения промежуточных вычислений,
размеры их заранее известны. Можно выделить память внутри calc_power(), но с учётом того, что число вызовов этой функции
очень велико, это представляется нерациональным. Наверное лучше под эти массивы сразу выделить нужную память, и передавать указатели в функцию. Но как быть с многопоточностью? Ведь в каждом потоке эти массивы должны содержать свои данные

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение14.05.2024, 21:25 
Заслуженный участник
Аватара пользователя


16/07/14
9201
Цюрих
Missir в сообщении #1639120 писал(а):
вообще, их можно сделать глобальными, но даст ли это преимущество в скорости или только внесёт путаницу?
Почти наверняка не даст.
Missir в сообщении #1639120 писал(а):
Наверное лучше под эти массивы сразу выделить нужную память, и передавать указатели в функцию. Но как быть с многопоточностью?
Два стандартных варианта - где-то перед запуском параллельного блока выделить память сразу на все потоки, либо сделать приватную переменную для каждого потока, и память выделять отдельно в каждом потоке, но по одному разу.

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение14.05.2024, 22:25 


15/12/22
198
mihaild в сообщении #1639131 писал(а):
сделать приватную переменную для каждого потока, и память выделять отдельно в каждом потоке, но по одному разу

Так чтоли?
Используется синтаксис C
int calc_power(double* X, int* ind, int* lims, int N, int* id, double* M, double* R)
{ private double *M, *R;
  private int *id;
  M=(double*)malloc(N*sizeof(double));
  R=(double*)malloc(N*N*sizeof(double));
  id=(int*)malloc(N*sizeof(int));
  ..........................................

}
 


а как потом высвобождать память по завершении работы?

-- 14.05.2024, 22:39 --

но в Си нет модификатора private

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение14.05.2024, 23:58 
Заслуженный участник
Аватара пользователя


16/07/14
9201
Цюрих
Вы же OMP используете?
Используется синтаксис C++
#pragma omp parallel
{
  void* x = malloc(100500);
  #pragma omp for
  for (int i = 0; i < 666; ++i) {
    magic(x);
  }
  free(x);
}
 

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение15.05.2024, 00:04 


15/12/22
198
mihaild
именно этого я до конца не пойму, magic(x); вызывается в разных потоках, а массив x один
можно поставить после for модификатор private(x), что будет означать, что x внутренняя переменная потока,
и что же, это приведёт к автоматическому выделению памяти для всех потоков?

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение15.05.2024, 00:50 
Заслуженный участник
Аватара пользователя


16/07/14
9201
Цюрих
Missir в сообщении #1639182 писал(а):
а массив x один
Нет, локальные по отношению к parallel переменные - свои в каждом потоке. Можно написать private(x), но тут это ничего не сделает.
Missir в сообщении #1639182 писал(а):
и что же, это приведёт к автоматическому выделению памяти для всех потоков
Блок parallel выполняется в каждом потоке, в том числе malloc.

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение15.05.2024, 01:16 


15/12/22
198
Понятно. Спасибо, буду пробовать.

 Профиль  
                  
 
 Re: Выделение памяти для многопоточной функции
Сообщение15.08.2024, 01:53 
Аватара пользователя


07/02/12
1439
Питер
mihaild в сообщении #1639131 писал(а):
Почти наверняка не даст.

Если они рядом в памяти и так находятся (передача по указателю), то не даст. Если создаются в разных ее частях - то объединение, скорее всего, даст.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group