我正在从头开始用 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 版本一起使用的函数。