Как вы планируете распараллеливать алгоритм сортировки оснований в C с помощью OpenMP?Параллелизация сортировки radix в C с помощью OpenMP
Моя программа представляет собой модификацию вашей типичной сортировки radix: она сортирует массив целых чисел на основе двоичного представления цифры, где вы можете изменять количество бит, которое должно интерпретироваться как одна цифра (который по существу будет использоваться для получения различного времени работы на основе того, насколько велики ваши целые числа).
У меня есть базисная-функция, которая принимает три аргумента:
// n is the number of elements in data
// b is number of bits that should be interpreted as one digit
void radix(int* data, int n, int b);
Далее, мои радиксы-функция перебирает через все биты (INT: 32 бита) с b
шагом:
for(bit = 0; bit < 32; bit += b) { ... }
Состоит из трех частей:
- Подсчет числа определенных разрядов (фактически бит), чтобы определить h Большое количество хранения требует ведро.
bucket[(data[i] >> bit) & (int)(pow(2,b)-1)]++
Ввод значений во временный массив (ведра).
bitval = (data[i] >> bit) & (int)(pow(2,b)-1)
temp_data[bucket[bitval]++] = data[i]
значения Копирование из временных ведер в
*data
указатель данной функции.for(i = 0; i < n; i++) { data[i] = temp_data[i] }
Я изменил с pow (2, b) на 1 << b, и это заметно улучшило время работы. Однако я не совсем понял, как работает «bitOffset», не могли бы вы подробнее остановиться на его использовании? –
@ LarsErikStorbukås - я исправил свой ответ, чтобы напрямую использовать счетчик сдвигов. (Предыдущий код имел ошибку, он должен был быть (shiftCount = (8 * sizeof (unsigned int) - bitOffset - numberofBits;). – rcgldr
@ LarsErikStorbukås - проверка частичного битового поля нужна только в том случае, если количество бит в элемент не является точным кратным количеству бит в поле, например 32-битное беззнаковое целое число с размером битового поля 7, наиболее значимое поле будет иметь только 4 бита (размер битового поля от MSF до LSF будет 4 7 7 7 7). – rcgldr