从Ctypes返回浮点数的难度

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

我目前正在尝试为一些C ++代码编写一个简单的包装程序,因此我将能够传递一些信号数据,对其进行GPU操作并将其发送回去。目前,我已经删除了所有GPU元素,因为我无法让ctypes返回除整数以外的任何东西。

我应该通过说不确定该决定的严重性来开头以下内容,但是我只设法通过将C ++函数包装在C函数中来使ctypes识别C ++函数。随着我尝试返回浮点数的错误继续,我已经意识到,无论错误的根源是什么,都可以肯定地分辨出C ++产生的数字与C产生的数字之间的区别。我将在稍后再讨论这一点。

extern "C" float* giveLotsZeroes(int length) {
    float* list2 = (float*)malloc(sizeof(float)*length);
    for (unsigned int i = 0; i < length; i++) list2[i] = 0;
    return list2;
}

这是我的示例C ++函数之一,用于测试文件“ kernal.cu”中返回浮点数的功能。它通过在“ chead.h”中定义的extern float* giveLotsZeroes(int length);__declspec(dllexport) float* giveLotsOfZeroes(int length);传递给C(注意,在函数名称中间使用Of来区分它们)。最后,在包含chead.h的Source.c中定义了float* giveLotsOfZeroes(int length) { return giveLotsZeroes(length); },并且链接器似乎没有任何问题将其编译为多线程dll。我对此有一个类似的迭代,它以整数形式返回零列表,其功能非常好,以至于我已经在GPU错误处理中实现了它,并且每行GPU代码似乎都引起了错误,相信错误处理实现可以正常工作的原因,但我稍后会介绍。

[尝试返回长度为128的整数列表时,我曾使用numpy的ctypeslib库取得了巨大的成功,]]

accelerator.getLastErrorCode.restype = np.ctypeslib.ndpointer(dtype=ctypes.c_int,shape=(128,))
accelerator.getLastLineExecuted.restype = np.ctypeslib.ndpointer(dtype=ctypes.c_int,shape=(128,))

并且这很好,但是,如果我用长度变量“ length”替换128,并用ctypes.c_float替换ctypes.c_int,python将返回一个整数,通常在1e8和1e10之间。有了这样奇怪的结果,我也尝试返回单个浮点数,它产生了相似的结果,尽管可能不那么令人惊讶,因为单个值函数也返回单个值。有趣的是,当我使用np.ctypeslib.ndpointer方法定义restypes时,python type函数仍然声明结果为numpy.ndarray,但是如果您将其视为一个则会抱怨。我尝试过将此函数的restypes定义或该函数的变体定义为ctypes.c_float*lengthctypes.POINTER(ctypes.c_float*length),但没有成功。

实际上,我制作了两个返回单个零的函数,一个将它从C ++返回到C再到python,另一个直接从C返回它,并使两个都将其零打印到控制台以确认两个C出现了问题,C也没有出现C ++零的问题,但是当他们到达python时,C的零已经变成1(无论后来C试图返回什么,我后来都发现了这种情况),而C ++的零已经变成一致的164。一位朋友建议将0的每个实例更改为0.0f,这将164更改为标准随机大数。

我遇到错误处理时遇到的唯一问题是,稍后再说,是在一个奇异但可重复的奇数实例中,700设法从一个仅应能够返回从0到29的数字。不确定这可能与其他错误有什么可能的联系,但如果有帮助,它会有所帮助。

我已将我的代码包含在下面的pastebin中,但是请注意,大部分python代码仅是对按预期工作和不按预期工作的测试。

https://pastebin.com/j7gfiKA6

我目前正在尝试为一些C ++代码编写一个简单的包装程序,因此我将能够传递一些信号数据,对其进行GPU操作并将其发送回去。目前,我已裁剪掉所有GPU元素...

python c++ c wrapper ctypes
1个回答
0
投票

您的返回值为ctypes.POINTER(ctypes.c_float)

© www.soinside.com 2019 - 2024. All rights reserved.