CudaOccupancyMaxPotentialBlockSize возвращает ошибку - PullRequest
0 голосов
/ 16 октября 2019

Мы используем 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 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...