測試數組大小 2²⁰ (1,048,576) 元素,重複 1,000 次求和,對比 CPU、GPU(含/不含內存分配拷貝)性能。
| 場景 | 耗時 | 說明 |
|---|---|---|
| CPU 純計算 | 7,720 ms | 單線程循環累加 |
| GPU 一次分配/拷貝 + 1000 次核函數 | 360 ms | 計算部分僅 360 ms,快 21.4 倍 |
| GPU 1000 次分配/拷貝 + 1000 次核函數 | 2,700 ms | 含重複內存操作,仍快 2.85 倍 |
cudaMalloc、cudaMemcpy 開銷巨大,特別是大數據量時。cudaMallocHost) 加速拷貝。cudaMemcpyAsync + 流 cudaStream 實現計算與傳輸重疊。// 樹狀歸約核函數(共享內存)
__global__ void block_sum(const double* input, double* per_block_results, size_t n) {
extern __shared__ double sdata[];
size_t i = blockIdx.x * blockDim.x + threadIdx.x;
double x = (i < n) ? input[i] : 0;
sdata[threadIdx.x] = x;
__syncthreads();
for (int offset = blockDim.x/2; offset > 0; offset >>= 1) {
if (threadIdx.x < offset) sdata[threadIdx.x] += sdata[threadIdx.x + offset];
__syncthreads();
}
if (threadIdx.x == 0) per_block_results[blockIdx.x] = sdata[0];
}
GPU 並行歸約計算本身極其高效,但端到端性能受限於內存傳輸。實際工程中必須從數據佈局、生命週期、傳輸策略全局優化,而非單純優化核函數。對於一次性小數據任務,CPU 往往更優;對於反覆計算、大數據、數據已在 GPU 的場景,GPU 優勢壓倒性。