如何在两个不同的位置定位主机和内核的数据

How do I locate the data of host and kernel in two different locations

我已经编写了将在 FPGA 设备上 运行 的内核代码。目前,我正在编写将在 CPU 上 运行 的主机代码。在上次与我的教授会面时,他告诉我主机中的数据(在我的例子中是数组)不应该位于与设备相同的内存 space 中。于是,他让我在host部分的数据使用指针。

实际上,1- 我不确定我是否理解为什么数据应该位于两个不同的位置。

2-如何使用指针来使用不同的内存位置。

3-bellow 是主机中的数组。知道如何将这些数组转换为指针吗?

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

for (int i = 0; i < 5430; i++) {
    for (int j = 0; j < 20; 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] = {};

您目前已经在堆栈上分配了数组。这限制了最大错误大小。最好使用带有(一维)指针的堆分配:

int* array_X_set = new int[5430*20]; // linearize 2D array
int* array_Y_set = new int[5430];

for (int i = 0; i < 5430; i++) {
    for (int j = 0; j < 20; j++)
        array_X_set[i+j*5430] = array_X_dataset[i+j*5430];
    array_Y_set[i] = array_Y_dataset[i];
}

int* X_train = new int[4344*20];
int* Y_train = new int[4344];
int* X_test = new int[1086*20];
int* Y_test = new int[1086];

在代码结束时,不要忘记再次释放分配的内存。对于每个 new[] 必须有一个对应的 delete[]:

delete[] array_X_set;
delete[] array_Y_set;

delete[] X_train;
delete[] Y_train;
delete[] X_test;
delete[] Y_test;

所有这些数组都在主系统内存中的主机 (CPU) 端。在您的设备 (FPGA) 上,您需要分配与 OpenCL Buffer 对象相同数量的(设备)内存。然后你可以用 enqueueWriteBuffer()enqueueReadBuffer().

复制数据