You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:00:58