#include <hip/hip_runtime.h>
__managed__ int managed_counter = 0;
__device__ __forceinline__ int atomic_increment(int* addr) {
return atomicAdd(addr, 1);
}
__global__ void increment_kernel(int* counter, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) {
atomic_increment(counter);
}
}
__global__ void scale_kernel(float* data, float scale, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) {
data[i] *= scale;
}
}
int main(void) {
const int N = 1 << 16;
float* managed_data = nullptr;
hipMallocManaged((void**)&managed_data, N * sizeof(float));
for (int i = 0; i < N; i++) {
managed_data[i] = (float)i;
}
float* pinned_data = nullptr;
hipHostMalloc((void**)&pinned_data, N * sizeof(float));
dim3 grid(N / 256);
dim3 block(256);
hipLaunchKernelGGL(scale_kernel, dim3(grid), dim3(block), 0, 0, managed_data, 2.0f, N);
hipLaunchKernelGGL(increment_kernel, dim3(grid), dim3(block), 0, 0, &managed_counter, N);
hipDeviceSynchronize();
printf("counter = %d, data[0] = %f\n", managed_counter, managed_data[0]);
hipMemcpy(pinned_data, managed_data, N * sizeof(float), cudaMemcpyDeviceToHost);
hipFree(managed_data);
hipFreeHost(pinned_data);
return 0;
}