gpt4 book ai didi

c++ - 通过引用(通过指针)传递参数的 OpenCL 函数中指针访问的优化

转载 作者:行者123 更新时间:2023-11-28 04:57:03 25 4
gpt4 key购买 nike

我正在尝试稍微优化我的 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++ 编译器在这种情况下会做什么也很有趣。

最佳答案

取决于您传递的指针的内存位置(tmaxtmin)。

  • 私有(private):编译器可能会将它们优化掉。
  • 本地:编译器无法优化它们,除非编译器清楚指针始终由组中的单个工作项指向。 (即使它可能仍然做不到)。在某些情况下,情况 2 可能会导致性能下降。
  • 全局:编译器永远不会优化它们,因为它不知道全局内存是否正在被另一个工作组甚至 CPU 端更改。在第二种情况下会有惩罚和额外的内存访问。

性能最好的解决方案是第一个。您在私有(private)空间中进行大部分检查,并且只在需要时访问指向内存的指针。不要担心使用额外的变量,GPU 有足够的寄存器:

  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_;

关于c++ - 通过引用(通过指针)传递参数的 OpenCL 函数中指针访问的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com