FreeBasic
Главная
Вход
Регистрация
Вторник, 16.04.2024, 09:31Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » как распараллелить критическое место программы (распараллеливание)
как распараллелить критическое место программы
12valera12Дата: Суббота, 11.06.2022, 19:06 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Вопрос как распараллелить критическое место программы ?
есть  некоторый Sub
в котором вложенный   FOR  FOR .. NEXT NEXT  
в котором считаются новые положения  частиц   
входные данные  из глобальных массвов  кординат и скоростей..
rem datalist  input  output from sub      ( all  single (float32))
rem  dt ,dfmax  , Rmin
rem  global   x () : global   y ()
rem  global  vx () : global vy ()
rem  global  MATERIAL()
rem  global    Num_neighbour  (n,NM)  '(element number,neighbor number)   element neighbor number
rem  global    Total_neighbour_n (n)  (element number)  amount neighbor  for (element number)

  я так понял если компиллятор gcc    то  Sub  можно переписать на си 
и потом    применить  #pragma omp parallel for  ?
создание парралельных тредов не катит  всремя создания  треда болше чем  время просчета итерации для  новых координат.
 
zamabuvaraeuДата: Вторник, 14.06.2022, 11:43 | Сообщение # 2
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Чтобы задачи выполнялись параллельно, необходимо чтобы они работали на разных процессорах.
Это можно сделать только запуская задачи в разных потоках.

Наиболее эффективной реализацией асинхронных задач будет пул потоков + чтение‐запись из портов завершения ввода‐вывода.

Варианты:

1. Можете реализовать пул потоков самостоятельно на связке CreateIoCompletionPort+CreateThread+GetQueuedCompletionStatus и назначать задачи функцией PostQueuedCompletionStatus. Это подходит для задач ввода‐вывода вроде чтения файлов и сети.
2. Если задачи не связаны с вводом‐выводом, можно упростить решение и использовать функцию QueueUserWorkItem.
 
12valera12Дата: Четверг, 16.06.2022, 22:13 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
спасибо  чтото нашел 
The overhead of Threadcreate is expensive when the thread is short-lived. In this case, it is worth looking at thread pooling.
The overhead of Threadcreate is expensive  ..в   этом убедился..  и точно   речь  о пулах потоков.. пока даже не представляю о чем и как это

https://www.freebasic.net/forum/viewtopic.php?t=29133
 
zamabuvaraeuДата: Пятница, 17.06.2022, 14:27 | Сообщение # 4
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Всё просто:

Код
#include once "windows.bi"

Function ThreadProc( _
        ByVal lpParameter As LPVOID _
    )As DWORD
    
    ' делаем любую полезную работу
    
    Return 0
    
End Function

Dim resCreateTask As BOOL = QueueUserWorkItem( _
    @ThreadProc, _
    Указатель на параметр, _
    WT_EXECUTEDEFAULT _
)
If resCreateTask = 0 Then
    Dim dwError As DWORD = GetLastError()
    Print "Ошибка постановки задачи для обработки!", dwError
End If
 
12valera12Дата: Суббота, 09.03.2024, 10:50 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Подскажите как распараллелить  Процедуру  на  4-6 потоков.
Например  пусть  частиц 100000
4 потока  работают  0-24999   25000-49999  50000 -74999  75000-100000
в  точках синхронизации  нужно подождать отстающие потоки для когерентности результата
вложения нет


Сообщение отредактировал 12valera12 - Суббота, 09.03.2024, 10:52
 
Форум » Freebasic » Вопросы по языку FreeBasic » как распараллелить критическое место программы (распараллеливание)
  • Страница 1 из 1
  • 1
Поиск: