Мы используем API CUDA Occupancy для определения занятости и оптимальных размеров блока и сетки.
Пример кода выглядит следующим образом.
__global__ int f3(int* a){*a=10;}
int main(){
int gridSize = 0;
int blockSize = 0;
cudaOccupancyMaxPotentialBlockSize(&gridSize, &blockSize, (void*)f3, 0, 0);
}
При компиляции мы получаем следующееошибка.
In function ‘void f3(int*)’:
hipOccupancyMaxPotentialBlockSize.cpp:42:23: error: ambiguating new declaration of ‘void f3(int*)’
__global__ int f3(int *a) { *a = 10;}
Итак, это правильный способ использования API.
Когда мы пытаемся использовать шаблонную версию API, как видно.
template <typename T> __global__ int f3(T *a) { *a = 10;}
cudaOccupancyMaxPotentialBlockSize<void(*)(int *)>(&gridSize, &blockSize, f3, 0, 0);
, мы получаем следующую ошибку.
no instance of function template "cudaOccupancyMaxPotentialBlockSize" matches the argument list
argument types are: (int *, int *, <unknown-type>, int, int)
Шаблонная версия API:определяется CUDA следующим образом:
template<class T>
__inline__ __host__ CUDART_DEVICE cudaError_t
cudaOccupancyMaxPotentialBlockSize(
int *minGridSize,
int *blockSize,
T func,
size_t dynamicSMemSize = 0,
int blockSizeLimit = 0)
{
return cudaOccupancyMaxPotentialBlockSizeVariableSMem(minGridSize, blockSize, func, __cudaOccupancyB2DHelper(dynamicSMemSize), blockSizeLimit);
}
Как справляться с такими ситуациями. Не допускает ли API какой-либо другой указатель на ядро, даже если приведение типов к void *.