高级内存优化
备注
本篇文档的数字仅做示例参考。具体数据,请以实际情况为准。
本文档帮你深入理解 MUSA 高级内存特性:系统内存优化、L2 缓存管理、Cluster 内存和异步执行。
页锁定内存
分配和释放
#include <musa.h>
#include <stdio.h>
int main() {
size_t size = 1000000 * sizeof(float);
// 分配页锁定内存
float* h_pinned;
musaMallocHost(&h_pinned, size);
// 初始化数据
for (int i = 0; i < 1000000; i++) {
h_pinned[i] = float(i);
}
// 使用完成后释放
musaFreeHost(h_pinned);
return 0;
}
异步内存传输
void asyncTransfer(float* h_pinned, float* d_data, size_t size) {
musaStream_t stream;
musaStreamCreate(&stream);
// 异步 H2D 拷贝
musaMemcpyAsync(d_data, h_pinned, size,
musaMemcpyHostToDevice, stream);
// 启动 kernel(与传输重叠)
processKernel<<<grid, block, 0, stream>>>(d_data);
// 异步 D2H 拷贝
musaMemcpyAsync(h_pinned, d_data, size,
musaMemcpyDeviceToHost, stream);
// 等待完成
musaStreamSynchronize(stream);
musaStreamDestroy(stream);
}
流水线传输
void pipelineTransfer(float* h_input, float* h_output, int n) {
float *d_input, *d_output;
musaMalloc(&d_input, n * sizeof(float));
musaMalloc(&d_output, n * sizeof(float));
// 分配 pinned buffers
float *h_pinned_in, *h_pinned_out;
musaMallocHost(&h_pinned_in, n * sizeof(float));
musaMallocHost(&h_pinned_out, n * sizeof(float));
musaStream_t stream;
musaStreamCreate(&stream);
// 拷贝输入数据到 pinned buffer
memcpy(h_pinned_in, h_input, n * sizeof(float));
// 异步传输 + 计算流水线
musaMemcpyAsync(d_input, h_pinned_in, n,
musaMemcpyHostToDevice, stream);
processKernel<<<grid, block, 0, stream>>>(d_input, d_output);
musaMemcpyAsync(h_pinned_out, d_output, n,
musaMemcpyDeviceToHost, stream);
// 等待完成
musaStreamSynchronize(stream);
// 拷贝结果
memcpy(h_output, h_pinned_out, n * sizeof(float));
// 清理
musaFreeHost(h_pinned_in);
musaFreeHost(h_pinned_out);
musaFree(d_input);
musaFree(d_output);
musaStreamDestroy(stream);
}