gpucoder.atomicOr - Atomically perform bit-wise OR between a specified value and a variable in global or

  shared memory - MATLAB ([original](https://in.mathworks.com/help/gpucoder/ref/gpucoder.atomicor.html)) ([raw](?raw))

Atomically perform bit-wise OR between a specified value and a variable in global or shared memory

Since R2021b

Syntax

Description

[A,oldA] = gpucoder.atomicOr([A](#mw%5F73b59a43-a237-41ad-9fde-1518d851afe8),[B](#mw%5F73b59a43-a237-41ad-9fde-1518d851afe8)) perform bit-wise OR between B and the value of A in global or shared memory and writes the results 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.

example

Examples

collapse all

Perform a simple atomic addition operation by using thegpucoder.atomicOr function and generate CUDA® code that calls corresponding CUDAatomicOr() APIs.

In one file, write an entry-point function myAtomicOr that accepts matrix inputs a and b.

function a = myAtomicOr(a,b)

coder.gpu.kernelfun; for i =1:numel(a) [a(i),~] = gpucoder.atomicOr(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('uint32', [1 30], [0 1]); B = coder.newtype('uint32', [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 myAtomicOr -d myAtomicOr

The generated CUDA code contains the myAtomicOr_kernel1 kernel with calls to the atomicOr() CUDA APIs.

// // File: myAtomicOr.cu // ...

static global launch_bounds(1024, 1) void myAtomicOr_kernel1( const uint32_T b, const int32_T i, uint32_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); atomicOr(&a_data[b_i], b); } } ...

void myAtomicOr(uint32_T a_data[], int32_T a_size[2], uint32_T b) { dim3 block; dim3 grid; ...

cudaMemcpy(gpu_a_data, a_data, a_size[1] * sizeof(uint32_T),
           cudaMemcpyHostToDevice);
myAtomicOr_kernel1<<<grid, block>>>(b, i, gpu_a_data);
cudaMemcpy(a_data, gpu_a_data, a_size[1] * sizeof(uint32_T),
           cudaMemcpyDeviceToHost);

...

}

Input Arguments

collapse all

Operands, specified as scalars, vectors, matrices, or multidimensional arrays. Inputs A and B must satisfy the following requirements:

Data Types: int32 | uint32 | uint64

Version History

Introduced in R2021b