Я больше программист на Фортране, чем на С, поэтому мои знания OpenMP в стиле С плохие, и я оставлю вам синтаксис.
Ваш самый простой подход здесь, вероятно, (я уточню это позже) просто распараллелить самый внешний цикл. По умолчанию OpenMP будет рассматривать переменную i
как приватную, а все остальные - как общие. Это, вероятно, не то, что вы хотите, вы, вероятно, хотите также сделать j
и k
и t
приватными. Я подозреваю, что вы также хотите val
личное.
Я немного озадачен утверждением в нижней части вашего гнезда циклов (то есть someFunction...
), которое, похоже, не возвращает никакого значения вообще. Работает ли это на побочные эффекты?
Итак, вам не нужно объявлять параллельную область, охватывающую весь этот код, и вам, вероятно, следует распараллеливать только самый внешний цикл. Если бы вам тоже пришлось распараллеливать внутренние циклы, вы могли бы обнаружить, что ваша установка OpenMP либо игнорировала их, порождала больше процессов, чем у вас есть процессоры, либо жаловалась горько.
Я говорю, что ваш самый простой подход, вероятно, состоит в том, чтобы распараллелить самый внешний цикл, потому что я сделал некоторые предположения о том, что делает ваша программа (фрагмент). Если предположения неверны, вы можете распараллелить один из внутренних циклов. Еще один момент, который нужно проверить, заключается в том, что количество выполнений параллелизма (ов), которые вы распараллеливаете, намного больше, чем количество используемых вами потоков. Вы не хотите иметь циклы выполнения OpenMP с счетчиком отключений, скажем, 7, на 4 потоках, баланс нагрузки будет очень плохим.