2014 dxdy logo

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

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




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


15/12/22
201
Функция имеет такой прототип:
Используется синтаксис 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
9416
Цюрих
Missir в сообщении #1639120 писал(а):
вообще, их можно сделать глобальными, но даст ли это преимущество в скорости или только внесёт путаницу?
Почти наверняка не даст.
Missir в сообщении #1639120 писал(а):
Наверное лучше под эти массивы сразу выделить нужную память, и передавать указатели в функцию. Но как быть с многопоточностью?
Два стандартных варианта - где-то перед запуском параллельного блока выделить память сразу на все потоки, либо сделать приватную переменную для каждого потока, и память выделять отдельно в каждом потоке, но по одному разу.

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


15/12/22
201
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
9416
Цюрих
Вы же 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
201
mihaild
именно этого я до конца не пойму, magic(x); вызывается в разных потоках, а массив x один
можно поставить после for модификатор private(x), что будет означать, что x внутренняя переменная потока,
и что же, это приведёт к автоматическому выделению памяти для всех потоков?

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


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

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


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

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


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

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

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

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



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

Сейчас этот форум просматривают: Geen


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

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