2012-08-16 64 views
2

在我的OpenCL代碼中(它不是我自己編寫的,它只是來自Internet的示例代碼),下面的句子使用了鉗位功能。在OpenCL代碼中使用鉗位功能

return clamp(color,0,1); 

但是似乎這使得編譯過程中的錯誤,所以我用CL_PROGRAM_BUILD_LOG從clGetProgramBuildInfo得到了錯誤的信息的消息。

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 Ubuntu 10.04 64位的環境。

+0

您可以從以下網站找到源代碼:http://www.gamedev.net/blog/1241/entry-2254210-realtime-raytracing-with-opencl-ii/ – user1292251 2012-08-16 10:30:32

回答

5

請嘗試以下

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

這種方式,我們肯定知道第二和第三PARAMS不是含糊不清,你試圖調用的函數:

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

如果這不工作,然後看看你的顏色參數,但第二和第三參數現在應該沒問題。

+0

謝謝,在你的指導下,鉗位問題消失了,現在只顯示最後兩條錯誤信息(296 ..,297 ..)。你對此有什麼想法嗎? – user1292251 2012-08-18 02:15:41

+0

in 296,什麼是r.origin ?註釋297,只是爲了清楚起見。&(float3)(0,0,-1)看起來很腥去掉&,或者用*替換它。或者甚至更好,看看float3的構造函數需要什麼,並以這種方式執行,例如float3(x,y,0)。你確定x,y的類型是float嗎? – 2012-08-19 18:36:41

2

在OpenCL中有幾個過載的鉗位內建函數;編譯器需要根據參數的類型精確選擇一個。有效組合是

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

其中T是積分的OpenCL或浮點類型之一,並且S是T的元素的標量類型當T是矢量類型。

看來你的示例代碼是非法地將float和integer參數混合到調用中。常數1和0的類型爲int,不同於類型爲float的0.0f和1.0f。

查看quick reference card瞭解更多詳情。

+0

謝謝,我正在看你提供的快速參考卡。我將對我的工作非常有用。無論如何,你有沒有關於最後兩個錯誤消息的想法? – user1292251 2012-08-18 02:17:12

+0

&(float3)(0,0,-1)正在取一個常數的地址,這看起來是非法的;將該float3值放入一個變量(例如,float3 zerozero1 =(float3)(0,0,-1);並傳遞該變量的地址,例如&zerozero1 – grrussel 2012-08-18 15:28:27

0

我在同一段代碼(http://www.gamedev.net/blog/1241/entry-2254210-realtime-raytracing-with-opencl-ii/)上遇到同樣的問題。它寫得很差,並設法掛斷我的電腦。

通過確保最後兩個參數是浮點數,clamp()問題確實得到修復。

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每次發生之前刪除*

然後代碼應該編譯,但該程序可能仍然崩潰。

0

也許不是你的問題,但值得注意的是:針對OpenCL 1.0和1.1之間夾略有改變,所以如果你不小心,你可以有一個版本,而不是其他的編譯代碼。具體而言,在OpenCL 1.1規範中,「附錄F - 更改」,「F.1來自OpenCL 1.0的變更摘要」中指出「將以下功能添加到OpenCL C編程語言(第6節):」,然後是「新建內置函數「,然後是」在6.11節中定義的鉗位整數函數「。3"

所以你最好完全限定的參數。

與此相關,在OpenCL中添加1.1(矢量,標量)的整函數的最小值和最大值的變體,所以不要使用那些在1.0 (將標量參數轉換爲向量)