C Многопоточность, вложенная в циклы - задача комбинаторного взрыва из поиска по сетке гиперпараметров - PullRequest
0 голосов
/ 13 марта 2019

У меня есть небольшая программа на C, содержащая менее 500 строк кода. Вот упрощенная версия. На самом деле это более сложный компьютер.

#include<stdio.h>

int array_a [100000000];
// array 382 MB in size, 100 million x 4 bytes

int main(void)
{
    for (int a = 0; a < 1000; a++)
        {
        for (int b = 0; b < 1000; b++)
            {
            for (int c = 0; c < 1000; c++)
                {
                for (int i = 0; i < 100000000; i++)
                    {
                    int x = array_a[i] + a + b + c;
                    }
                }
            }
        }
return 0;
}

Прямо сейчас я выполняю многопоточность вручную для моего 4-ядерного процессора, где я компилирую 4 разные версии кода. Используя приведенный выше пример, каждый процесс будет использовать 400 МБ оперативной памяти, что в сумме составит 1,6 ГБ.

Мне нужно изменить только два числа в первом цикле for для 4 разных сборников:

compile 1: for (int a = 0; a < 250; a++)
compile 2: for (int a = 250; a < 500; a++)
compile 3: for (int a = 500; a < 750; a++)
compile 4: for (int a = 750; a < 1000; a++)

Очень простое решение.

Я пытался выяснить pthreads, но я не могу обернуть голову вокруг этого. Мой код не использует функции и указатели.

Как бы вы разбили код выше на 25 потоков?

thread 1: (int a = 0; a < 40; a++)
thread 2: (int a = 40; a < 80; a++)
....
thread 24: (int a = 920; a < 960; a++)
thread 25: (int a = 960; a < 1000; a++)

Каждый поток будет использовать 400 МБ для массива (общее использование оперативной памяти 10 ГБ)? Или каждый поток будет использовать те же 400 МБ оперативной памяти (всего 400 МБ оперативной памяти)? Меня не волнует использование оперативной памяти, просто самое быстрое решение.

1 Ответ

2 голосов
/ 13 марта 2019

Есть OpenMP , который предоставляет API для распараллеливания.

Если вы хотите сделать это вручную с помощью pthreads и т. Д., Вы должны поместить циклы в обратный вызов потока, а затем передать каждому потоку значения a min и max в качестве индивидуального порядка работы.Все они могут обращаться к массиву одновременно, если ни один из потоков не перезаписывает область памяти, используемую другим потоком.

Вам нужно будет сравнить код и посмотреть, сколько потоков идеально, поскольку создание потоков сопряжено с накладными расходами.код.

...