Выполните простое атомарное, сравнивают и подкачивают операцию при помощи gpucoder.atomicCAS функционируйте и сгенерируйте CUDA® код, который вызывает соответствующий atomicCAS() CUDA API.
В одном файле запишите функции точки входа myAtomicCAS это признает, что матрица вводит aB, и c.
Создать тип для матрицы удваивается для использования в генерации кода, используйте coder.newtype функция.
Чтобы сгенерировать библиотеку CUDA, используйте codegen функция.
Сгенерированный код CUDA содержит myAtomicCAS_kernel1 ядро с вызовами atomicCAS() API CUDA.
//
// File: myAtomicCAS.cu
//
...
static __global__ __launch_bounds__(1024, 1) void myAtomicCAS_kernel1(
const uint32_T c, 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<int32_T>(idx);
atomicCAS(&a_data[b_i], b, c);
}
}
...
void myAtomicCAS(uint32_T a_data[], int32_T a_size[2], uint32_T b, uint32_T c)
{
dim3 block;
dim3 grid;
...
if (validLaunchParams) {
cudaMemcpy(gpu_a_data, a_data, a_size[1] * sizeof(uint32_T),
cudaMemcpyHostToDevice);
myAtomicCAS_kernel1<<<grid, block>>>(c, b, i, gpu_a_data);
cudaMemcpy(a_data, gpu_a_data, a_size[1] * sizeof(uint32_T),
cudaMemcpyDeviceToHost);
...
}