首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有SYCL_EXTERNAL属性,SYCL内核无法调用未定义的函数

没有SYCL_EXTERNAL属性,SYCL内核无法调用未定义的函数
EN

Stack Overflow用户
提问于 2022-05-09 01:17:57
回答 1查看 240关注 0票数 0

我试图计算KNN的欧几里德距离,但同时使用dpc++。训练数据集包含5个特征和1600行,而我希望并行计算当前测试点与网格上每个训练点之间的距离,但我始终得到有关sycl内核的错误。该功能的代码:

code

代码语言:javascript
复制
std::vector<double> distance_calculation_FPGA(queue& q,const std::vector<std::vector<double>>& dataset,const std::vector<double>& curr_test) {
range<1> num_items{ dataset.size()};
std::vector<double>res;


res.resize(dataset.size());
buffer dataset_buf(dataset);
buffer curr_test_buf(curr_test);
buffer res_buf(res.data(), num_items);

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 <(const int) a[i].size(); ++j) {
            dif[i] += (a[i][j] - b[j]) * (a[i][j] - b[j]) ;
        }
        });
 });
for (int i = 0; i < res.size(); ++i) {
    std::cout << res[i] << std::endl;
} 
//old distance calculation (serial)
//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;

}

我所收到的错误:

代码语言:javascript
复制
SYCL kernel cannot call a variadic function

SYCL kernel cannot call an undefined function without SYCL_EXTERNAL attribute

会非常感谢你的帮助!

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-09-08 17:45:34

我们尝试通过创建虚拟的'dataset‘和'curr_test’变量来运行您的代码。我们成功地运行了这个程序。请参阅这条线

请参阅下面所附的完整代码。

代码语言:javascript
复制
#include <CL/sycl.hpp>
#include <iostream> 
using namespace sycl;

std::vector<double> distance_calculation_FPGA(queue& q,const std::vector<std::vector<double>>& dataset,const std::vector<double>& curr_test) 
{
range<1> num_items{ dataset.size()};
std::vector<double>res;

res.resize(dataset.size());
buffer dataset_buf(dataset);
buffer curr_test_buf(curr_test);
buffer res_buf(res.data(), num_items);

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 <(const int) a[i].size(); ++j) {
//           dif[i] += (a[i][j] - b[j]) * (a[i][j] - b[j]) ;
         dif[i]+=a[i][j];          
        }
        });
    });
    q.wait(); //We have added this line of code for synchronization.
    for (int i : res) { 
        std::cout <<i<< std::endl;
    } 
    return res;
    }


int main(){
std::vector<std::vector<double>> dataset;
for(int i=0;i<5;i++)
{
    std::vector<double> d;

    for(int j=0;j<1600;j++)
    {
        d.push_back((double)j);
    }
    dataset.push_back(d);
}

std::vector<double> curr_test;
for(int i=0;i<1600;i++)
{
    curr_test.push_back((double)i);
}
queue q;
std::cout << "Running on "<< 
q.get_device().get_info<sycl::info::device::name>()<< std::endl; 
//print the device name as a test to check the parallelisation

distance_calculation_FPGA(q,dataset,curr_test);

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

https://stackoverflow.com/questions/72166136

复制
相关文章

相似问题

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