从 ispc 导出的函数中按值返回结构?

Posted

技术标签:

【中文标题】从 ispc 导出的函数中按值返回结构?【英文标题】:returning struct by value from ispc-exported function? 【发布时间】:2019-10-20 21:50:09 【问题描述】:

我无法从导出的 ispc 函数(使用 ispc v1.12 和 msvc 2017)中按值在 c++ 端获取结构。程序 编译和运行顺利(32位,调试模式),除了我有空字段,我期望非零值。在 32 位发布模式下,我的值​​略有不同。在 64 位中,我在 c++ 端总是有零。我没有 发现任何直接提及或此类 sn-p 的例子。捆绑样品仅包含 void 或 返回导出函数的原始类型。我的代码:

kernel.ispc:

struct fp32_2  float v0, v1; ;

export uniform fp32_2 loopback( uniform float arg0, uniform float arg1 )
    uniform fp32_2 result;
    result.v0 = arg0;
    result.v1 = arg1;
    print( "ispc side: v0 = %\n", result.v0 );
    print( "ispc side: v1 = %\n", result.v1 );
    return result;
    

kernel.h(ispc生成,相关部分):

#ifndef __ISPC_STRUCT_fp32_2__
#define __ISPC_STRUCT_fp32_2__
struct fp32_2 
    float v0;
    float v1;
;
#endif
...
extern "C"
    extern struct fp32_2 loopback(float arg0, float arg1);

main.cpp:

#include "kernel.h"
#include <iostream>

int main()
    auto res = ispc::loopback( 10.0f, 11.0f );
    std::cout << "c++ side: v0 = " << res.v0 << "\n";
    std::cout << "c++ side: v1 = " << res.v1 << "\n";
    

ispc文件编译命令行参数(32位调试模式):

ispc %(FullPath) --arch=x86 --target-os=windows --target=sse4-i32x4
-O1 --opt=disable-loop-unroll --emit-obj --outfile=$(IntDir)%(FileName).obj
--header-outfile=%(RootDir)%(Directory)%(Filename).h --werror -g

输出(32位调试模式或64位两种模式):

ispc side: v0 = 10.000000
ispc side: v1 = 11.000000
c++ side: v0 = 0
c++ side: v1 = 0

输出(32bit释放模式):

ispc side: v0 = 10.000000
ispc side: v1 = 11.000000
c++ side: v0 = 0
c++ side: v1 = 5.39308e+33

每次运行我都得到相同的值。我错过了什么或做错了什么?

提前致谢

【问题讨论】:

【参考方案1】:

这应该可以正常工作。我会在 Github 上提出问题或在 listserv 上与他们联系。

【讨论】:

以上是关于从 ispc 导出的函数中按值返回结构?的主要内容,如果未能解决你的问题,请参考以下文章

Pycuda 在函数参数中按值声明数组时返回错误

为啥要在 C 中声明一个只包含数组的结构?

我应该如何在 jna 中按值从 Java 传递和返回 unsigned int 到 C/C++

有没有办法通过逆向工程来恢复结构。指向该结构的指针由 DLL 中用于导出的唯一函数返回

javascript在嵌套对象/数组中按值查找

使用 JNA 在 Clojure 中按值获取和传递结构