Question: I thought the braces require 5 matches.

```
import re

rMatch = re.search(r'(.*[0-9]){5,}', 'A1B2C3D4E5')
print(rMatch)
print(rMatch.groups())

```

Why only one group?
How can I see the 5 matches that are taking place given the use of curly braces?

Answer: 
Local variables are either placed in hardware registers or local memory (which is effectively global memory).

In your example, however, variable `i` will be removed by the compiler because it is unused.
GPUs have a bunch of space dedicated for many registers stored directly in GPU computing units (ie. Streaming Multiprocessors). **Registers are not stored in memory** unless there is some *register spilling* happening (typically when you use too many registers in a given kernel). Register have no address unlike all memory bytes. The same thing happen for CPU except that the number of CPU registers is usually much smaller than on GPU. For example, an Intel Skylake core has 180 integer register and 168 vector registers while the instruction set architecture is limited to something like 16 integer/vector registers. Note that in case of register spilling, the value of registers is temporary stored in local memory (typically in the L1 cache if possible). Here is the overall memory hierarchy of a basic (Nvidia Fermi) GPU:

[![enter image description here](https://i.stack.imgur.com/hnMVq.png)](https://i.stack.imgur.com/hnMVq.png)

For more information, consider reading: [Local Memory and Register Spilling](https://developer.download.nvidia.com/CUDA/training/register_spilling.pdf).