OpenCL:不兼容的整数到指针转换传递
OpenCL : incompatible integer to pointer conversion passing
我写了下面的内核代码,但是它给了我下面的警告。我尝试了不同的解决方案但失败了。请任何建议都会有所帮助
`26:48: warning: incompatible integer to pointer conversion passing '__global int' to parameter of type 'int *'
array_dist[i] = Euclidean_distance(X_train[i], data_point[j]);
我的内核代码:
inline float Euclidean_distance(int * array_point_A, int * array_point_B) {
float sum = 0.0;
float w[20] = { 0.0847282, 0.0408621, 0.105036, 0.0619821, 0.0595455, 0.0416739, 0.0181147, 0.00592921,
0.040049, 0.0766054, 0.0441091, 0.0376111, 0.0124285, 0.0733558, 0.0587338, 0.0303001, 0.0579207, 0.0449221,
0.0530462, 0.0530462 };
for (int i = 0; i < 20; ++i) {
float a = array_point_A[i] - array_point_B[i];
float wieghted_distance = w[i] * (a * a);
sum += wieghted_distance;
}
return sqrt(sum);
}
__kernel void KNN_classifier(__global int * restrict X_train, __global int * restrict Y_train, __global int * restrict data_point, int k)
{
float array_dist[4344] = {};
int index_arr[4344] = {};
for (int i = 0; i < 4344; ++i) {
for (int j = 0; j < 20; ++j) {
array_dist[i] = Euclidean_distance(X_train[i], data_point[j]);
index_arr[i] = i;
}
}
函数参数__global int*
和int*
(等同于__private int*
)是不同的内存space。 __global
是视频内存,__private
是 GPU 芯片上的寄存器。
要消除警告,请在您的 Euclidean_distance 函数中,让 array_point_A
和 array_point_B
都键入 __global int* restrict
。那么编译器就知道你交了一个指向全局内存的指针space:
inline float Euclidean_distance(__global int * restrict array_point_A, __global int * restrict array_point_B) {
在内核中调用函数的地方,需要交出数组,而不是数组元素(去掉[i]
和[j]
,确保在[=中访问正确的元素23=]函数):
array_dist[i] = Euclidean_distance(X_train, data_point);
编辑:我不完全明白你想要代码做什么。
- 将整个数组交给函数or
- 只将数组元素交给函数
我已经在上面写了 1 的错误。
情况 2:删除函数参数的指针 *
并在函数中将它们作为变量访问,而不是数组(删除 [i]
):
inline float Euclidean_distance(int array_point_A, int array_point_B) {
...
float a = array_point_A - array_point_B;
...
}
我写了下面的内核代码,但是它给了我下面的警告。我尝试了不同的解决方案但失败了。请任何建议都会有所帮助
`26:48: warning: incompatible integer to pointer conversion passing '__global int' to parameter of type 'int *'
array_dist[i] = Euclidean_distance(X_train[i], data_point[j]);
我的内核代码:
inline float Euclidean_distance(int * array_point_A, int * array_point_B) {
float sum = 0.0;
float w[20] = { 0.0847282, 0.0408621, 0.105036, 0.0619821, 0.0595455, 0.0416739, 0.0181147, 0.00592921,
0.040049, 0.0766054, 0.0441091, 0.0376111, 0.0124285, 0.0733558, 0.0587338, 0.0303001, 0.0579207, 0.0449221,
0.0530462, 0.0530462 };
for (int i = 0; i < 20; ++i) {
float a = array_point_A[i] - array_point_B[i];
float wieghted_distance = w[i] * (a * a);
sum += wieghted_distance;
}
return sqrt(sum);
}
__kernel void KNN_classifier(__global int * restrict X_train, __global int * restrict Y_train, __global int * restrict data_point, int k)
{
float array_dist[4344] = {};
int index_arr[4344] = {};
for (int i = 0; i < 4344; ++i) {
for (int j = 0; j < 20; ++j) {
array_dist[i] = Euclidean_distance(X_train[i], data_point[j]);
index_arr[i] = i;
}
}
__global int*
和int*
(等同于__private int*
)是不同的内存space。 __global
是视频内存,__private
是 GPU 芯片上的寄存器。
要消除警告,请在您的 Euclidean_distance 函数中,让 array_point_A
和 array_point_B
都键入 __global int* restrict
。那么编译器就知道你交了一个指向全局内存的指针space:
inline float Euclidean_distance(__global int * restrict array_point_A, __global int * restrict array_point_B) {
在内核中调用函数的地方,需要交出数组,而不是数组元素(去掉[i]
和[j]
,确保在[=中访问正确的元素23=]函数):
array_dist[i] = Euclidean_distance(X_train, data_point);
编辑:我不完全明白你想要代码做什么。
- 将整个数组交给函数or
- 只将数组元素交给函数
我已经在上面写了 1 的错误。
情况 2:删除函数参数的指针 *
并在函数中将它们作为变量访问,而不是数组(删除 [i]
):
inline float Euclidean_distance(int array_point_A, int array_point_B) {
...
float a = array_point_A - array_point_B;
...
}