Понимание передачи указателя на функцию C ++ по ссылке в HIP - PullRequest
0 голосов
/ 11 января 2019

HIP - модель программирования AMD GPU, соответствующая CUDA от NVIDIA. У меня есть фрагмент кода из исходного кода HIP, который я не могу полностью понять. Напоминаем, что понимание следующего фрагмента кода не требует базовых знаний о HIP, но больше относится к указателю шаблона / функции C ++.

typedef int hipLaunchParm;    
template <typename... Args, typename F = void (*)(hipLaunchParm, Args...)>
inline void hipLaunchKernel(F&& kernel, const dim3& numBlocks, const dim3& dimBlocks,
                        std::uint32_t groupMemBytes, hipStream_t stream, Args... args) 
{
    hipLaunchKernelGGL(kernel, numBlocks, dimBlocks, groupMemBytes, stream, 
        hipLaunchParm{}, std::move(args)...);
}

Я запутался в следующем:

  • Если F - указатель на функцию, почему он должен иметь двойную ссылку в аргументе?
  • Чем полезен первый аргумент шаблона typename... Args?
  • hipLaunchParm - это просто псевдоним для целого числа, но что означает {}, когда он вызывается в аргументе?

1 Ответ

0 голосов
/ 11 января 2019

Если F - указатель на функцию, почему он должен иметь двойную ссылку в аргументе?

F не обязательно указатель на функцию. Это просто тип по умолчанию. Вы можете передать любой , который может быть вызван, при условии, что он вызывается с данными аргументами, и вы хотите избежать копирования объектов функции с состоянием, когда в этом нет необходимости. Некоторые могут даже не быть копируемыми. Это может быть причиной, почему они используют ссылку здесь.

, что касается C ++. Я не знаю об ограничениях, которые могут иметь HIP / CUDA.

Чем полезен первый аргумент шаблона typename... Args?

Позволяет передавать переменное число аргументов в делегированную функцию.

hipLaunchParm - это просто псевдоним для целого числа, но что означает {}, когда он вызывается в аргументе?

T{} - это синтаксис для инициализации значения временного объекта. В случае целого числа это означает, что в качестве аргумента передается ноль.

...