pyopencl 在程序构建期间抛出“RuntimeError: Unresolved external function”

问题描述 投票:0回答:0

我正在从头开始用 Python 实现 k 最近邻 (kNN) 算法。这种分类算法在运行过程中,需要计算n维空间中对象之间的距离。为了加速计算并出于教育目的,我决定在视频卡上使用并行计算。我知道可以使用 numpy 来执行此操作,我已经使用它实现了一些距离计算算法。在计算距离的时候,遇到需要计算二维数组的元素之和,即需要计算每一行元素的和。最初,我使用循环来完成此操作,但我知道这不是一般使用 pyopencl 和 opencl 时的最佳选择。我决定使用 sum reduction 。我还是不太会用C和C opencl来自己写这个算法。我找到了一个内置函数-work_group_reduce_add(),按照我的想法,它会计算每一行元素的总和,同时实现并行。在构建过程中,会出现一个 RuntimeError 并显示以下消息:

RuntimeError: clBuildProgram failed: <unknown error -9999> - clBuildProgram failed: <unknown error -9999> - clBuildProgram failed: <unknown error -9999>

Build on <pyopencl.Device 'NVIDIA GeForce GTX 650' on 'NVIDIA CUDA' at 0x255abaa7a60>:

ptxas fatal   : Unresolved extern function 'work_group_reduce_add'

我决定从我的任务转移到一个更简单的任务——使用 work_group_reduce_add() 函数添加两个数组的元素。代码如下所示,取自这个答案 - https://stackoverflow.com/a/64943023.

kernel = cl.Program(ctx, """
__kernel void resum(__global float *A, __global float *B, __global float *a) {
    int i = get_global_id(0);
    a[0] = work_group_reduce_add(A[i] + B[i]);
}
""").build()

但即使在这种情况下,build() 函数也会导致上述错误。我尝试将 -cl-std=CL2.0 作为编译器选项传递,但它没有提供任何东西。

使用的显卡为NVIDIA GeForce GTX 650,显卡驱动版本为474.14。支持的OpenCL版本为OpenCL 3.0,支持类型全

上下文创建如下,选择的是GTX 650

ctx = cl.Context(properties=[(cl.context_properties.PLATFORM, 
                                  cl.get_platforms()[0])], 
                     dev_type=cl.device_type.GPU)

输出cl.VERSION_TEXT:'2022.3.1'。我不知道为什么编译器找不到应该与 OpenCL 2.0 版本一起使用的函数。

python opencl reduce pyopencl
© www.soinside.com 2019 - 2024. All rights reserved.