0

エクスポートされた ispc 関数 (ispc v1.12 および msvc 2017 が使用されます) から値によって構造体を C++ 側で取得できません。プログラムはスムーズにコンパイルおよび実行されます (32 ビット、デバッグ モード)。32 ビット リリース モードでは、値がわずかに異なります。64 ビットでは、C++ 側に常にゼロがあります。そのようなスニペットの直接的な言及や例は見つかりませんでした。バンドルされたサンプルには、エクスポートされた関数を返す void またはプリミティブ型のみが含まれています。私のコード:

カーネル.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

出力 (32 ビット リリース モード):

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

実行するたびに同じ値が得られました。私は何が欠けているか、間違っていますか?

前もって感謝します

4

1 に答える 1