gpucoder.atomicMax - Atomically find the maximum between a specified value and a variable in global or
shared memory - MATLAB ([original](https://in.mathworks.com/help/gpucoder/ref/gpucoder.atomicmax.html)) ([raw](?raw))
Atomically find the maximum between a specified value and a variable in global or shared memory
Since R2021b
Syntax
Description
[A,oldA] = gpucoder.atomicMax([A](#mw%5Ffc97584e-68ed-4eb6-90dd-7d94b52c93f2),[B](#mw%5Ffc97584e-68ed-4eb6-90dd-7d94b52c93f2))
compares B
to the value of A
in global or shared memory and writes the max(A,B)
back into A. The operation is atomic in a sense that the entire read-modify-write operation is guaranteed to be performed without interference from other threads. The order of the input and output arguments must match the syntax provided.
Examples
Perform a simple atomic addition operation by using thegpucoder.atomicMax
function and generate CUDA® code that calls corresponding CUDAatomicMax()
APIs.
In one file, write an entry-point function myAtomicMax
that accepts matrix inputs a
and b
.
function a = myAtomicMax(a,b)
coder.gpu.kernelfun; for i =1:numel(a) [a(i),~] = gpucoder.atomicMax(a(i), b); end
end
To create a type for a matrix of doubles for use in code generation, use thecoder.newtype function.
A = coder.newtype('int32', [1 30], [0 1]); B = coder.newtype('int32', [1 1], [0 0]); inputArgs = {A,B};
To generate a CUDA library, use the codegen function.
cfg = coder.gpuConfig('lib'); cfg.GenerateReport = true;
codegen -config cfg -args inputArgs myAtomicMax -d myAtomicMax
The generated CUDA code contains the myAtomicMax_kernel1
kernel with calls to the atomicMax()
CUDA APIs.
// // File: myAtomicMax.cu // ...
static global launch_bounds(1024, 1) void myAtomicMax_kernel1( const int32_T b, const int32_T i, int32_T a_data[]) { uint64_T loopEnd; uint64_T threadId; ...
for (uint64_T idx{threadId}; idx <= loopEnd; idx += threadStride) { int32_T b_i; b_i = static_cast(idx); atomicMax(&a_data[b_i], b); } } ...
void myAtomicMax(int32_T a_data[], int32_T a_size[2], int32_T b) { dim3 block; dim3 grid; ...
cudaMemcpy(gpu_a_data, a_data, a_size[1] * sizeof(int32_T),
cudaMemcpyHostToDevice);
myAtomicMax_kernel1<<<grid, block>>>(b, i, gpu_a_data);
cudaMemcpy(a_data, gpu_a_data, a_size[1] * sizeof(int32_T),
cudaMemcpyDeviceToHost);
...
}
Input Arguments
Operands, specified as scalars, vectors, matrices, or multidimensional arrays. Inputs A
and B
must satisfy the following requirements:
- Have the same data type.
- Have the same size or have sizes that are compatible. For example,
A
is anM
-by-N
matrix andB
is a scalar or1
-by-N
row vector.
Data Types: int32
| uint32
| uint64
Version History
Introduced in R2021b
See Also
Functions
- gpucoder.atomicAdd | gpucoder.atomicCAS | gpucoder.atomicDec | gpucoder.atomicExch | gpucoder.atomicInc | gpucoder.atomicMin | gpucoder.atomicSub