#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..).
Сторона Хоста :
- вы инициализируете данные(как и в любой программе на языке Си).
- Создайте объект буфера с помощью clCreateBuffer() (думайте об этом как о резервировании памяти на устройстве) (аналогично выделите для вывода)
- Отправьте инициализированные данные на устройство с помощью clEnqueueWriteBuffer()(в ранее зарезервированное пространство)
- Вызовите ядро с помощью clEnqueueNDRangeKernel()(теперь устройство имеет код ядра и данные)
Сторона устройства:
- Выполните код ядра
- Запишите выходные данные в зарезервированное хостом пространство
Сторона Хоста:
- После завершения выполнения устройства хост считывает данные с устройства с помощью clEnqueueReadBuffer().
С помощью этого потока вы выгрузили вычисления на устройство и прочитали выходные данные на хост.
записка:
Это объяснение не на 100% точно, я попытался объяснить его более простым способом. Я бы посоветовал вам прочитать главу 3 из (https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf)