【发布时间】:2017-10-24 23:07:11
【问题描述】:
我目前正在尝试优化我的 OpenCL 代码。我使用一些指针来返回值。创建存储在寄存器中的临时变量是否更有效(至少我猜)或者我可以直接访问指针并在整个函数中使用它们,因为它不会对性能产生任何影响,因为编译器无论如何都会优化它?
让我给你看一个简单的盒子射线相交的例子:
tmin 和 tmax 存储在临时变量中:
bool intersect(const Ray* ray, float3 boxmin, float3 boxmax, float* tmin, float* tmax)
{
float3 invR = 1.0f / ray->dir;
float t1 = (boxmin.x - ray->origin.x) * invR.x;
float t2 = (boxmax.x - ray->origin.x) * invR.x;
float t3 = (boxmin.y - ray->origin.y) * invR.y;
float t4 = (boxmax.y - ray->origin.y) * invR.y;
float t5 = (boxmin.z - ray->origin.z) * invR.z;
float t6 = (boxmax.z - ray->origin.z) * invR.z;
float tmin_ = fmax(fmax(fmin(t1, t2), fmin(t3, t4)), fmin(t5, t6));
float tmax_ = fmin(fmin(fmax(t1, t2), fmax(t3, t4)), fmax(t5, t6));
if (tmax_ < 0)
return false;
if (tmin_ > tmax_)
return false;
*tmax = tmax_;
*tmin = tmin_;
return true;
}
直接访问:
bool intersect(const Ray* ray, float3 boxmin, float3 boxmax, float* tmin, float* tmax)
{
float3 invR = 1.0f / ray->dir;
float t1 = (boxmin.x - ray->origin.x) * invR.x;
float t2 = (boxmax.x - ray->origin.x) * invR.x;
float t3 = (boxmin.y - ray->origin.y) * invR.y;
float t4 = (boxmax.y - ray->origin.y) * invR.y;
float t5 = (boxmin.z - ray->origin.z) * invR.z;
float t6 = (boxmax.z - ray->origin.z) * invR.z;
*tmin = fmax(fmax(fmin(t1, t2), fmin(t3, t4)), fmin(t5, t6));
*tmax = fmin(fmin(fmax(t1, t2), fmax(t3, t4)), fmax(t5, t6));
if (*tmax < 0)
return false;
if (*tmin > *tmax)
return false;
return true;
}
这不是最好的例子,因为只有三个取消引用的指针,在性能上可能没有差异,但它只是为了说明我的意思。 是否有知识渊博的人知道大多数 OpenCL 编译器在这种情况下会做什么? 了解 C/C++ 编译器在这种情况下会做什么也会很有趣。
【问题讨论】:
-
哪个更快?是的。一是更快。也许。简介两人。对每一项进行基准测试。查看两个版本产生的机器代码。简而言之:相互测试两者。
标签: c++ c pointers opencl compiler-optimization