Occupancy calculator v.s. profiler

I get very different occupancy results from the calculator and the profiler.

10x8 threads/block; Calculator 44%, profiler: 32.1%
16x12 threads/block; Calculator 38%, profiler: 37.5%
16x14 threads/block; Calculator 44%, profiler: 29.2%
22x16 threads/block; Calculator 46%, profiler: 22.9%

My kernel uses 44 registers, 0 smem (Capability 2.0), so blocks/SM is limited by register usage.

Where does this difference come from? Does “occupancy” have different meanings?