Выполните простое атомарное, сравнивают и подкачивают операцию при помощи gpucoder.atomicCAS
функционируйте и сгенерируйте CUDA® код, который вызывает соответствующий atomicCAS()
CUDA
API.
В одном файле запишите функции точки входа myAtomicCAS
это признает, что матрица вводит a
B
, и 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);
...
}