5.5. Supported Atomic Operations¶
Numba provides access to some of the atomic operations supported in HSA, in the numba.hsa.atomic class.
5.5.1. Example¶
The following code demonstrates the use of numba.hsa.atomic.add to count every number in [0,32) occurred in the input array in parallel:
from numba import hsa
import numpy as np
@hsa.jit
def hsa_atomic_histogram(ary):
tid = hsa.get_local_id(0)
sm = hsa.shared.array(32, numba.uint32) # declare shared library
sm[tid] = 0 # init values to zero
hsa.barrier(1) # synchronize (wait for init)
loc = ary[tid] % 32 # ensure we are in range
hsa.atomic.add(sm, loc, 1) # atomic add
hsa.barrier(1) # synchronize
ary[tid] = sm[tid] # store result inplace
ary = np.random.randint(0, 32, size=32).astype(np.uint32)
orig = ary.copy()
# HSA version
hsa_atomic_histogram[1, 32](ary)
# Expected behavior
gold = np.zeros_like(ary)
for i in range(orig.size):
gold[orig[i]] += 1
print(ary) # HSA kernel result
print(gold) # for comparison