STXXL: ограниченный параллелизм при сортировке?
Я заполняю очень большой массив, используя stxxl::VECTOR_GENERATOR<MyData>::result::bufwriter_type
(что-то вроде 100M записей), которые мне нужно отсортировать параллельно.
Я использую stxxl::sort(vector->begin(), vector->end(), cmp(), memoryAmount)
метод, который в теории должен делать то, что мне нужно: сортировать элементы очень эффективно.
Тем не менее, во время выполнения этого метода я заметил, что полностью используется только один процессор, а все остальные ядра довольно простаивают (я подозреваю, что для извлечения входных данных не хватает активности, но на практике они ничего не делают).
Это мой вопрос: возможно ли использовать больше ядер на этапе сортировки, или параллелизм используется только для асинхронной выборки входных данных? Если да, есть ли документы, в которых объясняется, как это включить? (Я внимательно просмотрел документацию на сайте, но ничего не смог найти).
Спасибо большое!
РЕДАКТИРОВАТЬ
Спасибо за предложение. Ниже я приведу еще немного информации.
Прежде всего, я использую MacO для своих экспериментов. Я запускаю следующую программу и изучаю ее поведение.
typedef struct Triple {
long t1, t2, t3;
Triple(long s, long p, long o) {
this->t1 = s;
this->t2 = p;
this->t3 = o;
}
Triple() {
t1 = t2 = t3 = 0;
}
} Triple;
const Triple minv(std::numeric_limits<long>::min(),
std::numeric_limits<long>::min(), std::numeric_limits<long>::min());
const Triple maxv(std::numeric_limits<long>::max(),
std::numeric_limits<long>::max(), std::numeric_limits<long>::max());
struct cmp: std::less<Triple> {
bool operator ()(const Triple& a, const Triple& b) const {
if (a.t1 < b.t1) {
return true;
} else if (a.t1 == b.t1) {
if (a.t2 < b.t2) {
return true;
} else if (a.t2 == b.t2) {
return a.t3 < b.t3;
}
}
return false;
}
Triple min_value() const {
return minv;
}
Triple max_value() const {
return maxv;
}
};
typedef stxxl::VECTOR_GENERATOR<Triple>::result vector_type;
int main(int argc, const char** argv) {
vector_type vector;
vector_type::bufwriter_type writer(vector);
for (int i = 0; i < 1000000000; ++i) {
if (i % 10000000 == 0)
std::cout << "Inserting element " << i << std::endl;
Triple t;
t.t1 = rand();
t.t2 = rand();
t.t3 = rand();
writer << t;
}
writer.finish();
//Sort the vector
stxxl::sort(vector.begin(), vector.end(), cmp(), 1024*1024*1024);
std::cout << vector.size() << std::endl;
}
Действительно, кажется, что во время выполнения этой программы работает только один или максимум два потока. Обратите внимание, что на машине есть только один диск.
Подскажите пожалуйста, работает ли параллелизм на macos? Если нет, то я постараюсь использовать Linux, чтобы посмотреть, что произойдет. Или, может быть, потому, что есть только один диск?
1 ответ
В принципе то, что вы делаете, должно работать "из коробки". Когда все работает, вы должны увидеть, как все ядра выполняют обработку.
Так как это не работает, нам придется найти ошибку, и отладка того, почему мы не видим параллельных ускорений, все еще остается сложной задачей.
Основная идея состоит в том, чтобы перейти от маленьких к большим примерам:
что это за платформа? В MSVC нет параллелизма, только в Linux / gcc.
По умолчанию STXXL основывается на Linux / gcc с USE_GNU_PARALLEL. Вы можете отключить его, чтобы увидеть, если он имеет эффект.
Попробуйте воспроизвести значения примеров, показанные в http://stxxl.sourceforge.net/tags/master/stxxl_tool.html - с использованием USE_GNU_PARALLEL и без него.
Посмотрите, если только в памяти параллельная сортировка масштабируется на вашем процессоре / системе.