我在OpenCL中看到了smallpt實現,作者在內核中使用了自己的矢量類型和前置宏函數。在OpenCL中使用自己的矢量類型似乎更快
typedef struct { float x, y, z; } Vec;
#define vinit(v, a, b, c) { (v).x = a; (v).y = b; (v).z = c; }
#define vsmul(v, a, b) { float k = (a); vinit(v, k * (b).x, k * (b).y, k * (b).z) }
#define vdot(a, b) ((a).x * (b).x + (a).y * (b).y + (a).z * (b).z)
#define vnorm(v) { float l = 1.f/sqrt(vdot(v, v)); vsmul(v, l, v); }
and much more...
我測試了代碼,並用標準的內建float3類型替換了用戶定義的矢量類型和操作。我驚訝於作者的原始實現比內置float3的變體快10幀。之後,我用英特爾OpenCL應用程序內核生成器測試了一些情況,似乎證實內置函數速度較慢。
任何想法爲什麼?供應商推薦內置矢量化類型:/
這是什麼語言? C或C++中沒有內建類型'float3'。 –
你的基準測試代碼是什麼樣的?你在運行什麼硬件? –
這是基於CGP標準的OpenCL C,用於GPGPU編程。 基準測試代碼簡單地運行一百萬次以上的基本矢量操作,並將其與用戶定義的版本進行比較。 (norm,cross,dot,add,mull,...) 基準測試的硬件是Intel i7-3630QM(Intel HD 4000沒有在內核生成器中工作)。並且在我的nvidia quadro gpu(NVS 5200M)上運行smallpt代碼 這裏是原始的smallpt opencl實現http://www.phoronix-test-suite.com/benchmark-files/SmallptGPU-v1.6pts-1。 tar.bz2 – Erabong