2

私のOpenCLコード(私自身でコード化されていない、インターネットからの単なるサンプルコードです)には、クランプの機能を使用するための次の文があります。

return clamp(color,0,1);

ただし、これによりコンパイル中にエラーが発生するようです。そのため、clGetProgramBuildInfoからCL_PROGRAM_BUILD_LOGを使用してエラー情報メッセージを受け取りました。

Error during compilation! (-11)
4483
build log
:211:9: error: call to 'clamp' is ambiguous
        return clamp(color,0,1);
               ^~~~~
<built-in>:3558:26: note: candidate function
float4  __OVERLOADABLE__ clamp(float4 x, float min, float max)   ;
                         ^
<built-in>:3577:25: note: candidate function
float4 __OVERLOADABLE__ clamp(float4, float4, float4);
                        ^
<built-in>:3556:26: note: candidate function
float3  __OVERLOADABLE__ clamp(float3 x, float min, float max)   ;
                         ^
<built-in>:3575:25: note: candidate function
float3 __OVERLOADABLE__ clamp(float3, float3, float3);
                        ^
:296:52: error: address expression must be an lvalue or a function designator
                                r.origin = matrixVectorMultiply(viewTransform, &(float3)(0, 0, -1));
                                                                               ^~~~~~~~~~~~~~~~~~
:297:62: error: address expression must be an lvalue or a function designator
                                r.dir    = normalize(matrixVectorMultiply(viewTransform, &(float3)(x, y, 0)) - r.origin);
                                                                                         ^~~~~~~~~~~~~~~~~

OpenCLコードでクランプ機能を使用するために必要なキーワードはありますか?ところで、私はLinux Ubuntu10.0464ビットの環境を使用しています。

4

4 に答える 4

5

次を試してください

return clamp(color,0.0f,1.0f);

このようにして、2番目と3番目のパラメーターがあいまいではなく、関数を呼び出そうとしていることが確実にわかります。

clamp(float4 color, float min, float max);

これが機能しない場合は、カラーパラメータを確認してください。ただし、2番目と3番目のパラメータは問題ないはずです。

于 2012-08-16T10:56:02.633 に答える
2

OpenCLにはいくつかのオーバーロードされたクランプ組み込み関数があります。コンパイラは、引数のタイプに基づいて、正確に1つを選択する必要があります。有効な組み合わせは次のとおりです

T clamp(T,T,T) and T clamp(T,S,S)

ここで、TはOpenCL積分型または浮動小数点型の1つであり、Tがベクトル型の場合、SはTの要素のスカラー型です。

サンプルコードがfloat引数と整数引数を呼び出しに不正に混合しているように見えます。定数1と0は、タイプがタイプintの0.0fと1.0fとは異なり、タイプがタイプfloatです。

詳細については、クイックリファレンスカードを参照してください。

于 2012-08-17T11:56:47.923 に答える
0

同じコードで同じ問題が発生しています(http://www.gamedev.net/blog/1241/entry-2254210-realtime-raytracing-with-opencl-ii/)。それは貧弱に書かれていて、私のPCをぶら下げることができました。

クランプ()の問題は、最後の2つの引数がfloatであることを確認することで実際に修正されます。

matrixVectorMultiply()の問題は、その関数のシグネチャを変更することで修正されています。もともとは:

float3 matrixVectorMultiply(__global float* matrix, float3* vector){ 
    float3 result;
    result.x = matrix[0]*((*vector).x)+matrix[4]*((*vector).y)+matrix[8]*((*vector).z)+matrix[12];
    result.y = matrix[1]*((*vector).x)+matrix[5]*((*vector).y)+matrix[9]*((*vector).z)+matrix[13];
    result.z = matrix[2]*((*vector).x)+matrix[6]*((*vector).y)+matrix[10]*((*vector).z)+matrix[14];
    return result;
}

ただし、vectorがポインタになる理由はまったくないため、 。*が出現するたびにbeforeを削除できますvector

次に、コードをコンパイルする必要がありますが、プログラムはおそらくまだクラッシュします。

于 2013-12-14T11:49:04.883 に答える
0

おそらくあなたの問題ではありませんが、注目に値します。OpenCL1.0と1.1の間でクランプがわずかに変更されたため、注意しないと、一方のバージョンでコンパイルされ、もう一方のバージョンではコンパイルされないコードを使用できます。具体的には、OpenCL 1.1仕様、「付録F –変更点」、「F.1 OpenCL 1.0からの変更点の概要」では、「OpenCL Cプログラミング言語に次の機能が追加されています(セクション6):」、「新規」と記載されています。組み込み関数」、「セクション6.11.3で定義されたクランプ整数関数」

したがって、パラメータを完全に修飾するのが最善です。

これに関連して、OpenCL 1.1では整数関数minおよびmaxの(ベクトル、スカラー)バリアントが追加されたため、1.0では使用しないでください(代わりにスカラーパラメーターをベクトルにキャストします)。

于 2013-12-14T21:19:34.983 に答える