Всем привет, нужна ваша помощь, никак не могу задание сделать, помогите)
Дана последовательность символов С = {с0…сn–1}. Дан набор из N
пар кодирующих символов (ai,bi), т.е. все символы строки ai заменяются на
bi. Создать многопоточное приложение, кодирующее строку С следующим
образом: строка разделяется на подстроки и каждый поток осуществляет ко-
дирование своей подстроки. Количество символов с последовательности, ко-
личество кодирующих пар и потоков являются входными параметрами про-
граммы, количество символов в строке может быть не кратно количеству по-
токов.
# Tom (10.11.2016 / 00:44)
Всем привет, нужна ваша помощь, никак не могу задание сделать, помогите)
Предупреждаю сразу,
- то что написано внизу я не компилировал и не тестировал
- я никогда не использовал openmp и могу ошибаться в деталях и нагло ошибаться
- задачи дать тебе правильное решение у меня нет. Это тебе просто для идеи.
- если тебе это для приема на работу, то буть готов что после моего совета с тобой даже разговаривать не будут
Решение зависит от того на чем писать, например в Visual Studio есть вроде как openmp а есть полноценные трэды.
Я заглянул в openmp и вроде как логика и реализация на openmp может быть очень простая
Пример недобыдлокода (+/-)
#include <omp.h>
// если символы unicod, то тип не char, сам дальше придумаешь
// список пар может быть глабальным, или придумая чего другое
#define MAP_SIZE 256
char map[MAP_SIZE][2];
char encode(char symbol)
{
// найди пару и верни значение из нее
for(int i=0;i<MAP_SIZE;i++)
if( map[i][0]==symbol )
return map[i][1];
// придумай сам как жить в таком гадком мире, где нет полной перекодировки
}
void encode_block(char* data, int size)
{
for(int i=0;i<size;i++)
data[i]=encode(data[i]);
}
int endcode_data(char* data, int size, int threads)
{
// проверь сам нолики, параметры
// если количество задач больше чем длинна масива придумай что сделать
// не упади на делении на 0
....
// размер полного блока
int blocksize=size/threads;
// Сохрани количество задач
int t=omp_get_num_threads();
// попроси задач сколько надо
omp_set_num_threads(threads);
// выполни в параллель
#pragma omp parallel for
for(int i;i<threads;i++)
{
int offset=i*blocksize;
if( size-offset > blocksize )
{
// последний блок меньше целого блока
blocksize=size-offset)
}
encode_block(data+offset,blocksize);
}
// не знаю нужен ли барьер, типа подождать пока все завершаться
// доки надо читать
// но на всякий случай даем всем кончить
#pragma omp barrier
// Восстанови количество задач
omp_set_num_threads(t);
}
int main()
{
// Придумаем данные
char data[1021];
for(int i=0;i<sizeof(data);i++)
data[i]=i%256;
// Придумаем перекодировку
for(int i=0;i<MAP_SIZE;i++)
{
map[i][0]=i%256;
map[i][1]=255-i%256
}
// перекодируем
encode_data(data,sizeof(data),10);
return 0;
}
Количество использованных задач, я думаю, в случае openmp не гарантируется,
так как задачи могут переиспользоваться. но по крайней мере больше не будет.
Для того чтобы точно следовать условиям задания, можно по задаче на блок запускать, но это уже не openmp, а нечто тругое, придумай сам, что попользовать, сильно код не поменятеся.
Только вот подождать завершения всех задач придется самому.
Да на C++ это мало похоже, ну... бантики привяжешь авось.
Надеюсь шутка удалась, удачи