Снижение суммы с 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) на ваших "новых" данных, если размер и тип данных одинаковы.

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