Распараллеливание функции
Я пытаюсь реализовать параллелизм этой функции. Я хочу, чтобы она брала как можно больше потоков и записывала результаты в файл.
Результаты должны быть записаны в файл в порядке возрастания, поэтому первый результат должен быть записан первым, второй секундой и так далее.
Функция keyGen - это просто MD5 целого числа m, которое используется в качестве начальной точки для каждой цепочки. Reduction32 - это функция сокращения, она берет первые 8 байтов, добавляет t и возвращает это значение. Когда цепочка достигает своей конечной точки, она сохраняется в двоичном файле.
Есть ли умный способ сделать эту параллель? без нарушения порядка хранения конечных точек?
void tableGenerator32(uint32_t * text){
int mMax = 33554432, lMax = 236;
int m, t, i;
uint16_t * temp;
uint16_t * key, ep[2];
uint32_t tp;
FILE * write_ptr;
write_ptr = fopen("table32bits.bin", "wb");
for(m = 0; m < mMax ; m++){
key = keyGen(m);
for (t = 0; t < lMax; t++){
keyschedule(key);
temp = kasumi_enc(text);
tp = reduction32(t,temp);
temp[0]=tp>>16;
temp[1]=tp;
for(i=0; i < 8; i++){
key[i]=temp[i%2];
}
}
for(i=0;i<2;i++)
ep[i] = key[i];
fwrite(ep,sizeof(ep),1,write_ptr);
}
fclose(write_ptr);
}
1 ответ
Лучший способ распараллелить вышеупомянутую функцию, не сталкиваясь с проблемами параллелизма, - создать столько потоков памяти, сколько потоков вы хотите использовать, а затем разделить задачу на фракции, например, если у вас 4 потока,
- один поток выполняет задачу от 0 до mMax / 4
- один поток выполняет задачу от mMax / 4 до (mMax / 4) * 2
- один поток выполняет задачу от (mMax / 4) * 2 до (mMax / 4) * 3
- один поток выполняет задачу от (mMax / 4) * 3 до (mMax / 4) * 4
затем вы объединяете потоки результатов и записываете их в файл.