declaring variables in different address spaces

Have a couple of questions.

  1. To declare a variable in global memory(from within my kernel program) I have to use the device qualifier with a var declaration, inside the kernel program?

  2. Can we manually allot local memory(on the device) for thread, or is this something that only the compiler can decide and allot, based on whether there are enough registers or not for all the automatic vars in a thread?

  3. While specifying the parameters for a kernel i.e. void myKernel(int a, int *ptr), not specifying any qualifiers(like constant) with these parameter declarations, would result in these vars being placed in the local or global memory? Or is it that CUdeviceptr arguments are placed in global memory and other parameters are stored in the registers or local memory?

Thanks in advance.