Снижение суммы с CUB
Согласно этой статье, уменьшение суммы с CUB Library должно быть одним из самых быстрых способов сделать параллельное сокращение. Как вы можете видеть из фрагмента кода ниже, время выполнения является мерой, исключая сначала cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());
Я предполагаю, что это связано с подготовкой памяти, и когда мы уменьшаем в несколько раз одни и те же данные, нет необходимости каждый раз вызывать их, но когда у меня много разных массивов с одинаковым количеством элементов и типов данных, у меня делать это каждый раз? Если ответ "да", это означает, что использование библиотеки CUB становится бессмысленным.
size_t temp_storage_bytes;
int* temp_storage=NULL;
cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());
cudaMalloc(&temp_storage,temp_storage_bytes);
cudaDeviceSynchronize();
cudaCheckError();
cudaEventRecord(start);
for(int i=0;i<REPEAT;i++) {
cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());
}
cudaEventRecord(stop);
cudaDeviceSynchronize();
1 ответ
Я предполагаю, что это связано с подготовкой памяти, и когда мы сокращаем в несколько раз одни и те же данные, нет необходимости каждый раз вызывать их
Правильно.
но когда у меня много разных массивов с одинаковым количеством элементов и типов данных, нужно ли мне делать это каждый раз?
Нет, тебе не нужно делать это каждый раз. Единственная цель "первого" звонка cub::DeviceReduce::Reduce
(т.е. когда temp_storage=NULL
) предоставляет количество байтов, необходимое для временного хранения, необходимого CUB. Если тип и размер ваших данных не меняется, нет необходимости повторно запускать ни этот шаг, ни последующий cudaMalloc
операция. Вы можете просто позвонить cub::DeviceReduce::Reduce
снова (с temp_storage
указывая на предыдущее распределение, предоставленное cudaMalloc
) на ваших "новых" данных, если размер и тип данных одинаковы.