如何在OpenCL中读取.csv文件 [英] How to read a .csv file in OpenCL

查看:18
本文介绍了如何在OpenCL中读取.csv文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已将host code写在OpenCL中。但是我需要首先从read中获取数据,我需要确保我在读取文件时所做的操作是正确的。(我不确定这是否是在OpenCL中读取文件的方式)

1-我将read file function中写入的c++放在main之前。

2-然后,我放入函数来混合数据。同样在main

之前

3-在main函数中,我调用上述两个函数来读取数据,然后将其混合。

4-然后我编写主机代码部分,包括(平台、设备、上下文、队列、缓冲区.等)

这是我的代码:

 bool read_data_set(string filename, array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
    int field0, field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
        field12, field13, field14, field15, field16, field17, field18, field19, field20, field21;
    char comma;
    int line = 0;

    ifstream myfile(filename);

    if (myfile.is_open())
    {
        while (myfile
            >> field0 >> comma
            >> field1 >> comma
            >> field2 >> comma
            >> field3 >> comma
            >> field4 >> comma
            >> field5 >> comma
            >> field6 >> comma
            >> field7 >> comma
            >> field8 >> comma
            >> field9 >> comma
            >> field10 >> comma
            >> field11 >> comma
            >> field12 >> comma
            >> field13 >> comma
            >> field14 >> comma
            >> field15 >> comma
            >> field16 >> comma
            >> field17 >> comma
            >> field18 >> comma
            >> field19 >> comma
            >> field20 >> comma
            >> field21)
        {


            array<int, 20> inner_array{ field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
            field12, field13, field14, field15, field16, field17, field18, field19, field20 };
            array_X_dataset[line] = inner_array;
            array_Y_dataset[line] = field21;
            line++;

        }

        myfile.close();

    }
    else {
        cout << "Unable to open file";
        return true;
    }
    return false;
}

//functoin to randomly mix the dataset.
void mix_dataset(array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
    size_t len = array_X_dataset.size();
    for (size_t i = 0; i < len; ++i) {
        size_t swap_index = rand() % len;  // Random number between 0 and len-1.
        if (i == swap_index)
            continue;

        array<int, 20> data_point{  };
        data_point = array_X_dataset[i];
        array_X_dataset[i] = array_X_dataset[swap_index];
        array_X_dataset[swap_index] = data_point;
        int Y = array_Y_dataset[i];
        array_Y_dataset[i] = array_Y_dataset[swap_index];
        array_Y_dataset[swap_index] = Y;
    }
}
int main()
{
    // Read dataset from file.
    string filename = ".//Dataset.csv";
    static array<array<int, 20>, 5430> array_X_dataset{};
    static array<int, 5430> array_Y_dataset{};
    size_t rows = sizeof(array_X_dataset) / sizeof(array_X_dataset[0]);
    size_t cols = sizeof(array_X_dataset[0]) / sizeof(int);

    bool error = read_data_set(filename, array_X_dataset, array_Y_dataset);
    if (error) {
        cout << "Exiting with error while reading dataset file " << filename << endl;
        exit(-1);
    }
  
// Randomly mix the dataset and printout.
// Initialize the seed.
    srand(3);
    mix_dataset(array_X_dataset, array_Y_dataset);

    int array_X_set[5430][20];
    int array_Y_set[5430];

    // copy contents of the mixed std::arrays into plain arrays  
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++)
            array_X_set[i][j] = array_X_dataset[i][j];
        array_Y_set[i] = array_Y_dataset[i];
    }
    
    int X_train[4344][20] = {};
    int Y_train[4344] = {};
    int X_test[1086][20] = {};
    int Y_test[1086] = {};


    //split the dataset using 5 - fold cross validation
    float sum_accurecy = 0.0;
    int fold = 1;
   // cout << "inseret fold num " << endl;
    //cin >> fold;
    split_dataset(fold, array_X_set, array_Y_set, X_train, Y_train, X_test, Y_test);
        
//--------------------------host code--------------------------------------------------------------//

    // Search for an openCL platform
    cl_platform_id fpga_paltform = NULL;
    if (clGetPlatformIDs(1, &fpga_paltform, NULL) != CL_SUCCESS) {
    printf("Unable to get platform_id
");
    return 1;
  }

    // Search for an openCL device
    cl_device_id fpga_device = NULL;
    if (clGetDeviceIDs(fpga_paltform, CL_DEVICE_TYPE_ALL, 1, &fpga_device, NULL) != CL_SUCCESS) {
    ..............
.................

   

OpenCL

简而言之,推荐答案编程模型包含两个代码,主机代码(.c/.cpp.)它运行在主机(CPU)上,内核代码(.cl)运行在设备上(例如:GPU..)。

主机端:

  1. 您将初始化数据(就像在任何C程序中一样)
  2. 使用clCreateBuffer()创建Buffer对象(将其视为在设备上保留内存)(类似地分配给输出)
  3. 使用clEnqueue eWriteBuffer()将初始化数据发送到设备(发送到较早保留的空间)
  4. 使用clEnqueue eNDRangeKernel()调用内核(现在设备有内核代码和数据)

设备端:

  1. 执行内核代码
  2. 主机将输出数据写入保留空间

主机端:

  1. 设备完成执行后,主机使用clEnqueue eReadBuffer()从设备读取数据。

使用此流,您已将计算负载卸载到设备,并将输出读取到主机。

注意:

这个解释不是百分之百准确,我试着用更简单的方式来解释。我建议您阅读(https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf)第3章

这篇关于如何在OpenCL中读取.csv文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆