如何在OpenCL中读取.csv文件 [英] How to read a .csv file in OpenCL
本文介绍了如何在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..)。
主机端:
- 您将初始化数据(就像在任何C程序中一样)
- 使用clCreateBuffer()创建Buffer对象(将其视为在设备上保留内存)(类似地分配给输出)
- 使用clEnqueue eWriteBuffer()将初始化数据发送到设备(发送到较早保留的空间)
- 使用clEnqueue eNDRangeKernel()调用内核(现在设备有内核代码和数据)
设备端:
- 执行内核代码
- 主机将输出数据写入保留空间
主机端:
- 设备完成执行后,主机使用clEnqueue eReadBuffer()从设备读取数据。
使用此流,您已将计算负载卸载到设备,并将输出读取到主机。
注意:
这个解释不是百分之百准确,我试着用更简单的方式来解释。我建议您阅读(https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf)第3章
这篇关于如何在OpenCL中读取.csv文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文