Cuda 我可以信任NVCC优化掉返回类型中的std::pair吗?

Cuda 我可以信任NVCC优化掉返回类型中的std::pair吗?,cuda,std-pair,nvcc,copy-elision,rvo,Cuda,Std Pair,Nvcc,Copy Elision,Rvo,有时,我们需要编写一个(小型)CUDA设备端函数,返回两个值。在C语言中,您可以让该函数去掉两个参数,例如: __device__ void pair_maker(float x, float &out1, float& out2); 在C++中,编写C++的习惯用法是返回 STD::配对< /C>(可能是 STD::tuple < /Calp>或结构,但C++元组是笨拙的,结构不够通用): \uuuuuuuuuuuuuuuuuuuuuuuuuuuuu设备std::配对器(fl

有时,我们需要编写一个(小型)CUDA设备端函数,返回两个值。在C语言中,您可以让该函数去掉两个参数,例如:

__device__ void pair_maker(float x, float &out1, float& out2);
在C++中,编写C++的习惯用法是返回<代码> STD::配对< /C>(可能是<代码> STD::tuple < /Calp>或结构,但C++元组是笨拙的,结构不够通用):

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu设备std::配对器(float x);

我的问题:我可以信任NVCC(使用
--expt relaxed constepr
)优化指针的结构,并直接分配给变量,然后从
中分配给变量。第一个
。第二个
元素?

我没有完整的答案,但从我有限的经验来看,NVCC似乎可以优化
std::pair
了。插图(另请参阅):

无额外副本或与施工相关的操作

__device__ std::pair<float, float> pair_maker(float x);
#include <utility>

 __device__ std::pair<float, float> pair_maker(float x) {
    float  sin, cos;
    __sincosf(x, &sin, &cos);
    return {sin, cos};
}

__device__ float foo(float x) {
    auto p = pair_maker(x);
    auto sin = p.first;
    auto cos = p.second;
    return sin + cos;
}

__global__ void bar(float x, float *out) { *out = foo(x); }

__global__ void baz(float x, float *out) {
    float sin, cos;
    __sincosf(x, &sin, &cos);
    *out = sin + cos;
}
ld.param.f32    %f1, [param_0];
ld.param.u64    %rd1, [param_1];
cvta.to.global.u64      %rd2, %rd1;
sin.approx.f32  %f2, %f1;
cos.approx.f32  %f3, %f1;
add.f32         %f4, %f2, %f3;
st.global.f32   [%rd2], %f4;
ret;