Here you need to cap the number of block, as there is a limit of 16 *1024 block.

num_blocks = std::min(16 * 1024, size);

In k_vector_add_fast, you need to add a loop similar to this:

for(int i = (blockIdx.x); i< THE_SIZE; i+=gridDim.x){
 what you have already.
}