#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#define CUDA_CHECK(call) \
do { \
cudaError_t err = call; \
if (err != cudaSuccess) { \
fprintf(stderr, "CUDA Error: %s at %s:%d\n", \
cudaGetErrorString(err), __FILE__, __LINE__); \
exit(EXIT_FAILURE); \
} \
} while(0)
__global__ void vec_add_kernel(const float* A, const float* B, float* C, int n) {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (idx < n) {
C[idx] = A[idx] + B[idx];
}
}
void vec_add_cpu(const float* A, const float* B, float* C, int n) {
for (int i = 0; i < n; i++) {
C[i] = A[i] + B[i];
}
}
int verify(const float* cpu_result, const float* gpu_result, int n) {
for (int i = 0; i < n; i++) {
if (fabs(cpu_result[i] - gpu_result[i]) > 1e-5) {
printf("❌ Mismatch at index %d: CPU=%f, GPU=%f\n", i, cpu_result[i], gpu_result[i]);
return 0;
}
}
printf("✅ Results match!\n");
return 1;
}
int main() {
const int N = 1 << 20;
const int size = N * sizeof(float);
printf("向量加法: N = %d (%.2f MB)\n", N, size / 1024.0 / 1024.0);
float *h_A = (float*)malloc(size);
float *h_B = (float*)malloc(size);
float *h_C = (float*)malloc(size);
float *h_C_gpu = (float*)malloc(size);
for (int i = 0; i < N; i++) {
h_A[i] = float(i) * 0.01f;
h_B[i] = float(i) * 0.02f;
}
float *d_A, *d_B, *d_C;
CUDA_CHECK(cudaMalloc(&d_A, size));
CUDA_CHECK(cudaMalloc(&d_B, size));
CUDA_CHECK(cudaMalloc(&d_C, size));
CUDA_CHECK(cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice));
CUDA_CHECK(cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice));
int threads_per_block = 256;
int blocks = (N + threads_per_block - 1) / threads_per_block;
printf("启动配置: Grid=%d, Block=%d, Total=%d threads\n",
blocks, threads_per_block, blocks * threads_per_block);
vec_add_kernel<<<blocks, threads_per_block>>>(d_A, d_B, d_C, N);
CUDA_CHECK(cudaGetLastError());
CUDA_CHECK(cudaDeviceSynchronize());
CUDA_CHECK(cudaMemcpy(h_C_gpu, d_C, size, cudaMemcpyDeviceToHost));
vec_add_cpu(h_A, h_B, h_C, N);
verify(h_C, h_C_gpu, N);
CUDA_CHECK(cudaFree(d_A));
CUDA_CHECK(cudaFree(d_B));
CUDA_CHECK(cudaFree(d_C));
free(h_A);
free(h_B);
free(h_C);
free(h_C_gpu);
printf("✅ 完成!\n");
return 0;
}