前文AMD rocr-libhsakmt分析系列8-3: queue内核实现讲述了queue的实现,本文是测试用例的功能分析。
1. 功能概述
这个测试函数用于测试通过更新队列参数来禁用和重新启用CP(Command Processor)队列的功能。该测试验证了队列禁用后不会执行新提交的命令包,以及重新启用后能够正常执行命令。
2 关键实现分析
2.1 初始化阶段
int gpuNode = pTestParamters->gpuNode;
HsaMemoryBuffer destBuf(PAGE_SIZE, gpuNode, false);
destBuf.Fill(0xFFFFFFFF);
PM4Queue queue;
- 获取GPU节点ID
- 创建一个页面大小的内存缓冲区,用于测试写入操作
- 将缓冲区填充为
0xFFFFFFFF作为初始值 - 创建PM4队列(PM4是AMD GPU的命令包格式)
2.2 队列创建和事件设置
ASSERT_SUCCESS_GPU(queue.Create(gpuNode), gpuNode);
HsaEvent *event;
ASSERT_SUCCESS_GPU(CreateQueueTypeEvent(false, false, gpuNode, &event), gpuNode);
- 在指定GPU节点上创建队列
- 创建用于同步的HSA事件
2.3 第一次测试:正常队列操作
queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As<unsigned int*>(), 0, 0));
queue.Wait4PacketConsumption(event);
WaitOnValue(destBuf.As<unsigned int*>(), 0);
- 提交一个写入命令包,将值
0写入缓冲区 - 等待命令包执行完成
- 验证写入成功(缓冲区值从
0xFFFFFFFF变为0)
2.4 禁用队列测试
destBuf.Fill(0xFFFFFFFF);
EXPECT_SUCCESS_GPU(queue.Update(BaseQueue::DEFAULT_QUEUE_PERCENTAGE, BaseQueue::DEFAULT_PRIORITY, true), gpuNode);
queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As<unsigned int*>(), 1, 1));
Delay(2000);
EXPECT_EQ_GPU(destBuf.As<unsigned int*>()[0], 0xFFFFFFFF, gpuNode);
- 重新填充缓冲区为
0xFFFFFFFF - 关键:调用 queue.Update() 的第三个参数为 true,这会禁用队列
- 提交一个新的写入命令包(写入值
1) - 等待2秒
- 验证:缓冲区值仍为
0xFFFFFFFF,说明命令包没有执行(队列被成功禁用)
2.5 重新启用队列测试
EXPECT_SUCCESS_GPU(queue.Update(BaseQueue::DEFAULT_QUEUE_PERCENTAGE, BaseQueue::DEFAULT_PRIORITY, false), gpuNode);
queue.Wait4PacketConsumption(event);
WaitOnValue(destBuf.As<unsigned int*>(), 1);
- 调用 queue.Update() 的第三个参数为 false,重新启用队列
- 等待之前提交的命令包执行完成
- 验证缓冲区值变为
1,说明队列重新启用后,之前暂停的命令包得到执行
2.6 清理资源
hsaKmtDestroyEvent(event);
EXPECT_SUCCESS_GPU(queue.Destroy(), gpuNode);
- 销毁事件对象
- 销毁队列
3. 测试意义
这个测试验证了KFD(Kernel Fusion Driver)中队列管理的重要功能:
-
动态队列控制:能够在运行时禁用和启用队列
-
命令包排队机制:禁用期间提交的命令包会被暂停,而不是丢失
-
状态恢复:重新启用后,暂停的命令包能够继续执行
1043

被折叠的 条评论
为什么被折叠?



