#include #include #include // HIP kernel for vector addition __global__ void vectorAdd(const float* a, const float* b, float* c, int n) { int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < n) { c[idx] = a[idx] + b[idx]; } } int main() { const int N = 1024; const size_t size = N * sizeof(float); // Allocate host memory float* h_a = (float*)malloc(size); float* h_b = (float*)malloc(size); float* h_c = (float*)malloc(size); // Initialize input vectors for (int i = 0; i < N; i++) { h_a[i] = (float)i; h_b[i] = (float)(i * 2); } // Allocate device memory float *d_a, *d_b, *d_c; hipMalloc(&d_a, size); hipMalloc(&d_b, size); hipMalloc(&d_c, size); // Copy input data to device hipMemcpy(d_a, h_a, size, hipMemcpyHostToDevice); hipMemcpy(d_b, h_b, size, hipMemcpyHostToDevice); // Launch kernel int threadsPerBlock = 256; int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock; hipLaunchKernelGGL(vectorAdd, dim3(blocksPerGrid), dim3(threadsPerBlock), 0, 0, d_a, d_b, d_c, N); // Copy result back to host hipMemcpy(h_c, d_c, size, hipMemcpyDeviceToHost); // Verify result bool success = true; for (int i = 0; i < N; i++) { float expected = h_a[i] + h_b[i]; if (h_c[i] != expected) { printf("Mismatch at index %d: expected %f, got %f\n", i, expected, h_c[i]); success = false; break; } } if (success) { printf("Standalone: Vector addition successful! (N=%d)\n", N); } // Cleanup hipFree(d_a); hipFree(d_b); hipFree(d_c); free(h_a); free(h_b); free(h_c); return success ? 0 : 1; }