現在、OpenCLコードを最適化しようとしています。私は値を返すためにいくつかのポインタを使用します。レジスタに格納された一時変数を作成する方が効率的ですか(コンパイラがこれを最適化するので、少なくとも私は推測します)か、ポインタに直接アクセスして関数全体で使用できますか?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;
}
をまあ、それはありません最も良い例は、3つの逆参照されたポインターがあるためです。パフォーマンスに差はないかもしれませんが、私が意味することを実証するだけです。 十分な知識を持っている人がいますか?この場合、ほとんどのOpenCLコンパイラは何をしていますか? このような場合にC/C++コンパイラが何をするのか知ることも興味深いでしょう。
どちらが高速ですか?はい。 1つは速いです。多分。 2つをプロファイルします。それぞれのベンチマーク2つのバージョンが生成するマシンコードを見てください。要するに、お互いに対して2つをテストする。 –