     const void* boxesInput, const void* anchorsInput, int* numDetectionsOutput, T* nmsScoresOutput,
     int* nmsClassesOutput, int* nmsIndicesOutput, void* nmsBoxesOutput, cudaStream_t stream)
 {
-    unsigned int tileSize = 1024;
+    unsigned int tileSize = param.numSelectedBoxes / 4;
     if (param.numSelectedBoxes <= 512)
     {
         tileSize = 512;

        cudaMemsetAsync(nmsScoresOutput, 0x00, param.batchSize * param.numOutputBoxes * sizeof(T), stream);
        cudaMemsetAsync(nmsBoxesOutput, 0x00, param.batchSize * param.numOutputBoxes * 4 * sizeof(T), stream);
        cudaMemsetAsync(nmsClassesOutput, 0x00, param.batchSize * param.numOutputBoxes * sizeof(int), stream);
    }

    // Counters Workspace

    cub::DoubleBuffer<T> scoresDB(topScoresData, sortedScoresData);
    cub::DoubleBuffer<int> indexDB(topIndexData, sortedIndexData);

    // Device Specific Properties
    int device;
    cudaGetDevice(&device);
    struct cudaDeviceProp properties;
    cudaGetDeviceProperties(&properties, device);
    if (properties.regsPerBlock >= 65536)
    {
        // Most Devices
        param.numSelectedBoxes = 4096;
    }
    else
    {
        // Jetson TX1/TX2
        param.numSelectedBoxes = 2048;
    }

    // Kernels
    status = EfficientNMSFilterLauncher<T>(param, (T*) scoresInput, topNumData, topIndexData, topAnchorsData,
        topOffsetsStartData, topOffsetsEndData, topScoresData, topClassData, stream);
