У меня есть небольшая программа на 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 МБ оперативной памяти)? Меня не волнует использование оперативной памяти, просто самое быстрое решение.