Как прочитать файл .csv в OpenCL

#opencl

Вопрос:

Я написал host code это в OpenCL . Но сначала мне нужны read данные из a .csv file. , мне нужно убедиться, что то, что я сделал при чтении файла, правильно. (Я не уверен, что это способ редактирования файла в opencl)

1 — Я ставлю read file function то, что написано c перед main своим .

2 — затем я поставил функцию для смешивания данных. Также до того, как main

3 — В main функции я вызываю две вышеперечисленные функции, чтобы прочитать данные, а затем смешать их.

4 — затем я пишу часть кода хоста, которая включает(платформу, устройство, контекст, очередь, буферы….и т. Д.)

Это мой код:

  bool read_data_set(string filename, array<array<int, 20>, 5430>amp; array_X_dataset, array<int, 5430>amp; 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>amp; array_X_dataset, array<int, 5430>amp; 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, amp;fpga_paltform, NULL) != CL_SUCCESS) {
    printf("Unable to get platform_idn");
    return 1;
  }

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

   
 

Ответ №1:

Короче говоря, модель программирования OpenCL содержит два кода, код хоста(.c/.cpp..), который выполняется на хосте(CPU) и коде ядра(.cl), который выполняется на устройстве(например:GPU..).

Сторона Хоста :

  1. вы инициализируете данные(как и в любой программе на языке Си).
  2. Создайте объект буфера с помощью clCreateBuffer() (думайте об этом как о резервировании памяти на устройстве) (аналогично выделите для вывода)
  3. Отправьте инициализированные данные на устройство с помощью clEnqueueWriteBuffer()(в ранее зарезервированное пространство)
  4. Вызовите ядро с помощью clEnqueueNDRangeKernel()(теперь устройство имеет код ядра и данные)

Сторона устройства:

  1. Выполните код ядра
  2. Запишите выходные данные в зарезервированное хостом пространство

Сторона Хоста:

  1. После завершения выполнения устройства хост считывает данные с устройства с помощью clEnqueueReadBuffer().

С помощью этого потока вы выгрузили вычисления на устройство и прочитали выходные данные на хост.

записка:

Это объяснение не на 100% точно, я попытался объяснить его более простым способом. Я бы посоветовал вам прочитать главу 3 из (https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf)