Hi,
I wanted to know if volumetric/3d Pooling is already supported?
I tried using the cudnnSetPoolingNdDescriptor function with nbDims = 3 and always get CUDNN_STATUS_NOT_SUPPORTED in the call to cudnnPoolingForward.
It works fine for nbDims = 2.
Example code which works for 4dimensional input and 2dimensional pooling but not 5dimensional input and 3dimensional pooling:
int main(int argc, char** argv) {
cudnnHandle_t context_handle;
cudnnTensorDescriptor_t input_desc;
cudnnTensorDescriptor_t output_desc;
cudnnPoolingDescriptor_t pool_desc;
cudnnCreate(&context_handle);
cudnnCreateTensorDescriptor(&input_desc);
cudnnCreateTensorDescriptor(&output_desc);
cudnnCreatePoolingDescriptor(&pool_desc);
// Set variable dimensions
// b c 0 1 2 format
cudnnPoolingMode_t pool_mode = CUDNN_POOLING_MAX;
float alpha = 1;
float beta = 0;
int nbDims = 5;
int poolDims = 3;
// changing to nbDims = 4 and poolDims = 2 makes it work.
int inputDimA[5] = {1,1,1,1,1};
int outputDimA[5] = {1,1,1,1,1};
int poolShapeA[3] = {1,1,1};
int poolPadA[3] = {0,0,0};
int poolStrideA[3] = {1,1,1};
int inputStrideA[5] = {1,1,1,1,1};
int outputStrideA[5] = {1,1,1,1,1};
checkCudnnErrors(cudnnSetTensorNdDescriptor(input_desc, CUDNN_DATA_FLOAT,
nbDims, inputDimA, inputStrideA));
checkCudnnErrors(cudnnSetTensorNdDescriptor(output_desc, CUDNN_DATA_FLOAT,
nbDims, outputDimA, outputStrideA));
// Allocata data memory and fill with values
float *srcData = NULL, *filterData = NULL, *dstData = NULL;
float* inputHost = new float[1];
inputHost[0] = 1;
float* outputHost = new float[1];
outputHost[0] = 1;
// Allocate memory on graphics card
checkCudaErrors(cudaMalloc(&srcData, 1*sizeof(float)));
checkCudaErrors(cudaMalloc(&dstData, 1*sizeof(float)));
// Copy values to graphics card
checkCudaErrors(cudaMemcpy(srcData, inputHost, 1*sizeof(float),
cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(dstData, outputHost, 1*sizeof(float),
cudaMemcpyHostToDevice));
checkCudnnErrors(cudnnSetPoolingNdDescriptor(pool_desc, pool_mode, poolDims, poolShapeA,
poolPadA, poolStrideA ));
checkCudnnErrors(cudnnPoolingForward(context_handle, pool_desc, &alpha,
input_desc, srcData, &beta, output_desc, dstData));
}
checkCudnnErrors and checkCudaErrors just check if the status value is CUDNN_STATUS_SUCCESS.