作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时,人们想要编写一个(小的)CUDA 设备端函数来返回两个值。在 C 语言中,您可以让该函数接受两个输出参数,例如:
__device__ void pair_maker(float x, float &out1, float& out2);
但是在 C++ 中,惯用的写法是返回一个 std::pair
(好吧,也许是一个 std::tuple
,或者一个结构,但是C++ 元组很笨重,结构不够通用):
__device__ std::pair<float, float> pair_maker(float x);
我的问题:我可以信任 NVCC(使用 --expt-relaxed-constexpr
)来优化指针的构造,然后直接分配给我稍后分配给的变量吗? .first
和 .second
元素对?
最佳答案
我没有完整的答案,但从我有限的经验来看——NVCC 似乎可以优化 std::pair
。插图(也在 GodBolt 上):
#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;
}
内核 bar()
和 baz()
编译成相同的 PTX 代码:
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;
没有额外的副本或与构建相关的操作。
关于cuda - 我可以相信 NVCC 可以优化返回类型中的 std::pair 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60155716/
我正在使用 PHPMailer 从我的脚本中通过 SMTP 发送电子邮件。有问题的电子邮件实际上是使用电子邮件到 SMS 网关的手机号码。现在,理想情况下,我想建立一个大的密件抄送列表,以一批发送所有
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我是一名优秀的程序员,十分优秀!