【问题标题】:OpenCL : incompatible integer to pointer conversion passingOpenCL:不兼容的整数到指针转换传递
【发布时间】:2021-08-30 00:11:02
【问题描述】:

我编写了以下内核代码,但它给了我以下警告。我尝试了不同的解决方案但失败了。请任何建议都会有所帮助

`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;
        }
    }

    

【问题讨论】:

    标签: c++ opencl


    【解决方案1】:

    函数参数的__global int*int*(与__private int*相同)是不同的内存空间。 __global 是视频内存,__private 是 GPU 芯片上的寄存器。

    要消除警告,在您的 Euclidean_distance 函数中,将 array_point_Aarray_point_B 都输入 __global int* restrict。然后编译器就知道你交出了一个指向全局内存空间的指针:

    inline float Euclidean_distance(__global int * restrict array_point_A, __global int * restrict array_point_B) {
    

    在内核中调用函数的地方,需要交出数组,而不是数组元素(去掉[i][j],确保在Euclidean_distance函数中访问正确的元素):

    array_dist[i] = Euclidean_distance(X_train,  data_point);
    

    编辑:我不完全理解你想要代码做什么。

    1. 将整个数组交给函数或
    2. 只将数组元素交给函数

    我已经在上面写了 1 的错误。

    情况2:删除函数参数的指针*,并在函数中将它们作为变量而不是数组访问(删除[i]):

    inline float Euclidean_distance(int array_point_A, int array_point_B) {
        ...
            float a = array_point_A - array_point_B;
        ...
    }
    

    【讨论】:

    • 会检查并回复您
    • 我尝试了你的建议,但给了我这个警告:“警告:不兼容的整数到指针转换将'__global int'传递给'__global int *'类型的参数;使用& [-Wint -conversion] array_dist[i] = Euclidean_distance(X_train[i],data_point[j]); ^~~~~~~~~~ "
    • 也添加restrict
    • 我只是添加了限制。并且仍然给了我同样的交战“:28:48:警告:不兼容的整数到指针转换将'__global int'传递给'__global int *'类型的参数;使用& [-Wint-conversion] array_dist [i]获取地址= Euclidean_distance(X_train[i],data_point[j]); ^~~~~~~~~~"
    • 非常感谢您的帮助,它适用于案例 1。这是我的案例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多