SYCL作业四:实验课练习
团队名称
西南石油大学:龙井湖二队
问题陈述
改写gemm_basic代码26,27行,利用work group和local work item的坐标来计算global坐标。
项目源码:https://github.com/pengzhao-intel/oneAPI_course/blob/main/code/gemm_basic.cpp#L26
源码中需要进行修改的部分:
实现方案
nd_range三维空间示例图:
本题要求的只是一个二维空间:
一个橙色部分是一个work-group对应到cuda模型就是一个块,橙色部分的一个小方块是一个item对应到cuda模型就是一个线程。(我们当前举例的是work-group的大小是4*4而不是必须是4*4)
所以本题考察怎样通过work-group和item的索引来确定一个item在全局的索引。
比如我要确定这个点的坐标
那么就要看他是在第几个work-group,和他在当前work-group中第几个item。由图显然 他在第3个work-group中行为1,列为1(work-group由0开始计数)。所以就可以由此得出他在整体的索引
rows = 1 * (4*4)+ 1;
cols = 1 * (4*4) + 1;
对应到cuda当中就是
rows = blockIdx.x * blockDim.x + threadIdx.x;
cols = blockIdx.y * blockDim.y + threadIdx.y;
那么oneapi里面哪些参数对应一个work-group的大小,该item在哪个work-group中,该item在一个work-group中的x方向的索引,y方向的索引呢。又该怎么用呢。
在oneapi中
创建一个二维的nd模型x轴对应global_ndrange,y轴对应local_ndrange,并用nd_item类来映射二维模型
nd_item类中又有很多方法
template <int Dimensions = 1> class nd_item {
public:
static constexpr int dimensions = Dimensions;
nd_item() = delete;
/* -- common interface members -- */
id<Dimensions> get_global_id() const;
size_t get_global_id(int dimension) const;
size_t get_global_linear_id() const;
id<Dimensions> get_local_id() const;
size_t get_local_id(int dimension) const;
size_t get_local_linear_id() const;
group<Dimensions> get_group() const;
sub_group get_sub_group() const;
size_t get_group(int dimension) const;
size_t get_group_linear_id() const;
range<Dimensions> get_group_range() const;
size_t get_group_range(int dimension) const;
range<Dimensions> get_global_range() const;
size_t get_global_range(int dimension) const;
range<Dimensions> get_local_range() const;
size_t get_local_range(int dimension) const;
// Deprecated in SYCL 2020.
id<Dimensions> get_offset() const;
nd_range<Dimensions> get_nd_range() const;
};
}
网上查询每个函数得知:
get_local_id(int dimension);//返回该item所在work-group中dimension方向上的索引
get_group(int dimension);//返回该item是在dimension方向上哪个work-group
get_local_range(int dimension);//返回一个work-group中dimension方向上有多少个item
便由此推理出 以下结果
运行校验
问题陈述
修改程序输入数据的大小,设定非M=N=K=2000,修改程序,并使其通过正确性测试
项目源码:https://github.com/pengzhao-intel/oneAPI_course/blob/main/code/gemm_basic.cpp#L154
实现方案
先定位M,N,K在哪里被应用
然后找到此函数在main函数中哪里应用了然后进行修改就行了
虽然但是感觉这道题有点简单了,可能是我题意没读懂,可能不是想表达只修改参数就可以了
运行校验