首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FPGA设备上运行dpc++代码后的奇怪行为

在FPGA设备上运行dpc++代码后的奇怪行为
EN

Stack Overflow用户
提问于 2022-05-19 18:53:06
回答 1查看 48关注 0票数 0

我使用DPC++来加速FPGA设备上的knn算法。下面的代码是我为欧几里德距离编写的代码。问题是,fpga_emulation在fpga硬件(Intel 10 OneAPI)上运行时运行得很好,没有任何问题,它为结果缓冲区中的所有值提供-nan,这意味着parallel_for lioop中出现了一些问题。但我没有发现任何错误的地方,模拟也奏效了。

我正在使用Intel Devcloud平台。

代码语言:javascript
复制
std::vector<double> distance_calculation_FPGA(queue& q, const std::vector<std::vector<double>>& dataset, const std::vector<double>& curr_test) {
    std::cout<<"convert 2D to 1D"<<std::endl;
    std::vector<double>linear_dataset;
    for (int i = 0; i < dataset.size(); ++i) {
        for (int j = 0; j < dataset[i].size(); ++j) {
            linear_dataset.push_back(dataset[i][j]);
        }
    }
    std::cout<<"buffering"<<std::endl;
      range<1> num_items{dataset.size()};
    std::vector<double>res;
    //std::cout << "im in" << std::endl;

    res.resize(dataset.size());
    buffer dataset_buf(linear_dataset);
    buffer curr_test_buf(curr_test);
    buffer res_buf(res.data(), num_items);
    
    std::cout<<"submit a job"<<std::endl;
    auto start = std::chrono::high_resolution_clock::now();
    {
    q.submit([&](handler& h) {
        accessor a(dataset_buf, h, read_only);
        accessor b(curr_test_buf, h, read_only);

        accessor dif(res_buf, h, write_only, no_init);
        h.parallel_for(num_items, [=](auto i) {
                for (int j = 0; j < 5; ++j) {
                    dif[i] += (b[j] - a[i * 5 + j]) * (b[j] - a[i * 5 + j]);  
                }
           // out << "i : " << i << " i[0]: " << i[0] << " b: " << b[0] << cl::sycl::endl;
            });
        }).wait();
    }
    auto finish = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = finish - start;
    std::cout << "Elapsed time: " << elapsed.count() << " s\n";
    /* Iterative distance calculation
        for (int i = 0; i < dataset.size(); ++i) {
            double dis = 0;
            for (int j = 0; j < dataset[i].size(); ++j) {
                dis += (curr_test[j] - dataset[i][j]) * (curr_test[j] - dataset[i][j]);
            }
            res.push_back(dis);
        }
        */
    return res;
}

动车组

fpga硬件的结果:./knn.fpga

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-19 21:42:49

关于您的使用的问题,通常使用类似于NaN的东西,显然我们正在查看未初始化的内存(或者除以您没有的0)。是否可能范围是一些,如何关闭的FGPA和/或值没有正确初始化的数组切口?

对不起,我知道这是非常基本的,但没有您的数据集,我不能百分之百肯定我能复制它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72309737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档