DPC++实现二维数组加法的parallel_for编写求助
DPC++二维矩阵加法parallel_for实现方案
核心内核逻辑
parallel_for传入的id<2> idx是二维工作项的全局索引,idx[0]对应矩阵行下标i,idx[1]对应矩阵列下标j,直接用该索引访问三个设备访问器的对应位置做加法赋值即可,你空缺的代码段直接填以下内容:
int i = idx[0]; int j = idx[1]; dev_acs3[i][j] = dev_acs1[i][j] + dev_acs2[i][j]; // 若需要内核侧调试打印,可补充以下代码 // out << "位置[" << i << "][" << j << "]计算结果:" << dev_acs3[i][j] << endl;
现有代码注意修正点
- 访问器建议显式声明权限:输入矩阵ha、hb对应的访问器加
read_only标记,结果矩阵hc对应的访问器加write_only标记,减少不必要的数据同步开销。 host_accessor需要放在q.submit()调用的外部,等待内核任务执行完成后再读取结果,否则会出现数据竞争,拿到未初始化的错误值。可以在submit后调用.wait()显式同步,也可以靠buffer作用域析构的隐式同步保证执行顺序。- buffer创建时建议显式指定二维维度
range<2>{N,N}和数据类型,避免类型推导错误。
完整可运行代码
#include <CL/sycl.hpp> #include <iostream> #define N 2 using namespace sycl; int main(){ int ha[N][N] = {{1,2},{3,4}}; int hb[N][N] = {{1,2},{3,4}}; int hc[N][N]; // 同步作用域块 { queue q; buffer<int, 2> my_buf1(ha, range<2>{N,N}); buffer<int, 2> my_buf2(hb, range<2>{N,N}); buffer<int, 2> my_buf3(hc, range<2>{N,N}); q.submit([&](handler &h) { stream out(1024,256,h); accessor dev_acs1(my_buf1, h, read_only); accessor dev_acs2(my_buf2, h, read_only); accessor dev_acs3(my_buf3, h, write_only); h.parallel_for(range<2>{N,N}, [=](id<2> idx){ int i = idx[0]; int j = idx[1]; dev_acs3[i][j] = dev_acs1[i][j] + dev_acs2[i][j]; }); }).wait(); host_accessor host_hc(my_buf3, read_only); for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ std::cout << host_hc[i][j] << " "; } std::cout << std::endl; } } return 0; }
编译运行后输出结果为:
2 4 6 8
内容的提问来源于stack exchange,提问作者BHARATH KUMAR
相关产品推荐
相关产品推荐

