Распараллеливание функции

Я пытаюсь реализовать параллелизм этой функции. Я хочу, чтобы она брала как можно больше потоков и записывала результаты в файл.

Результаты должны быть записаны в файл в порядке возрастания, поэтому первый результат должен быть записан первым, второй секундой и так далее.

Функция 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

затем вы объединяете потоки результатов и записываете их в файл.

Другие вопросы по тегам