1

JOCl (java バージョンの opencl) を使用しているときに、このエラーに遭遇しました。

Exception in thread "main" org.jocl.CLException: CL_BUILD_PROGRAM_FAILURE
Build log for device 0:
<program source>:3:255: error: **call to '__cl_pow' is ambiguous**
__kernel void sampleKernel(__global short *x,             __global short *y,           __global uint *stop,           __global uint *moment){private uint a = 1;private uint b = 2;for(uint i =0; i<= 100;i++){ for(uint j = stop[i]; j < stop[i+1]; j++){    pow(a,b)      }  }}

私のカーネルコード:

  private static String programSource =
            "__kernel void "
            + "sampleKernel(__global short *x,"
            + "             __global short *y,"
            + "           __global uint *stop,"
            + "           __global uint *moment)"
            + "{"
            + "for(uint i =0; i<= 100;i++){"
            + " for(uint j = stop[i]; j < stop[i+1]; j++){"
            + "    moment[i] = moment[i] + (pow(x[j],0)*pow(y[j],0))  "
            + "     }"
            + "  }"
            + "}";

xとyのデータ型が原因だと思いました。しかし、単純な pow(1,1) を実行すると、同じエラーが発生します。

どうすればこれを修正できますか?

4

1 に答える 1

3

推測:

整数型にはpowのオーバーロードがないため、コンパイラは利用可能なすべてのオーバーロードの中から最も近い一致を見つけようとします。

  • パウ(ダブル、ダブル)
  • pow(フロート、フロート)
  • ...

しかし、shortはdoubleだけでなくfloatにも変換できるため、使用する単一のオーバーロードが見つからないため、エラーが発生します。

この仮説を確認するには、キャストで使用する変換を明示してみてください。

(pow((float)x[j],0)*pow((float)y[j],0))
于 2012-12-01T16:08:52.557 に答える