Sounds like you have to do your own memory allocation. I'd just allocate a pool that could accomodate a reasonable amount of those 2mb blocks and another cl_mem object to hold the order of actually allocated blocks.
If you run out of blocks, double the size of both arrays or something similar, like adjusting buffer sizes to accomodate a fixed, but large, number of new blocks. That way, the cost of the copy operation will be fairly small, in the sense that it will happen rarely.
i kinda tried to avoid this....
But thanks anyway!