From b3c68af40a30d46d3f5297f08aa2eaae74bb270f Mon Sep 17 00:00:00 2001 From: Evghenii Date: Fri, 8 Nov 2013 13:57:16 +0100 Subject: [PATCH] added volume rendering to run on GPU --- builtins/target-nvptx64.ll | 70 ++- .../mandelbrot_tasks3d/mandelbrot_task.o | Bin 8320 -> 0 bytes examples_cuda/volume_rendering/Makefile | 3 +- examples_cuda/volume_rendering/volume.ispc | 13 +- examples_cuda/volume_rendering/volume1.ispc | 410 +++++++++++++++ examples_cuda/volume_rendering/volume_cu.cpp | 478 ++++++++++++++++++ examples_cuda/volume_rendering/volume_ispc.bc | Bin 455740 -> 0 bytes .../volume_rendering/volume_ispc_avx.bc | Bin 10228 -> 0 bytes .../volume_rendering/volume_ispc_nvptx64.bc | Bin 19100 -> 0 bytes ispc.cpp | 2 +- 10 files changed, 965 insertions(+), 11 deletions(-) delete mode 100644 examples_cuda/mandelbrot_tasks3d/mandelbrot_task.o create mode 100644 examples_cuda/volume_rendering/volume1.ispc create mode 100644 examples_cuda/volume_rendering/volume_cu.cpp delete mode 100644 examples_cuda/volume_rendering/volume_ispc.bc delete mode 100644 examples_cuda/volume_rendering/volume_ispc_avx.bc delete mode 100644 examples_cuda/volume_rendering/volume_ispc_nvptx64.bc diff --git a/builtins/target-nvptx64.ll b/builtins/target-nvptx64.ll index ecd536a3..297b9779 100644 --- a/builtins/target-nvptx64.ll +++ b/builtins/target-nvptx64.ll @@ -175,8 +175,28 @@ declare double @__round_uniform_double(double) nounwind readnone declare double @__floor_uniform_double(double) nounwind readnone declare double @__ceil_uniform_double(double) nounwind readnone -declare @__round_varying_float() nounwind readnone -declare @__floor_varying_float() nounwind readnone +define <1 x float> @__round_varying_float(<1 x float>) nounwind readonly alwaysinline { + %float_to_int_bitcast.i.i.i.i = bitcast <1 x float> %0 to <1 x i32> + %bitop.i.i = and <1 x i32> %float_to_int_bitcast.i.i.i.i, + %bitop.i = xor <1 x i32> %float_to_int_bitcast.i.i.i.i, %bitop.i.i + %int_to_float_bitcast.i.i40.i = bitcast <1 x i32> %bitop.i to <1 x float> + %binop.i = fadd <1 x float> %int_to_float_bitcast.i.i40.i, + %binop21.i = fadd <1 x float> %binop.i, + %float_to_int_bitcast.i.i.i = bitcast <1 x float> %binop21.i to <1 x i32> + %bitop31.i = xor <1 x i32> %float_to_int_bitcast.i.i.i, %bitop.i.i + %int_to_float_bitcast.i.i.i = bitcast <1 x i32> %bitop31.i to <1 x float> + ret <1 x float> %int_to_float_bitcast.i.i.i +} +define <1 x float> @__floor_varying_float(<1 x float>) nounwind readonly alwaysinline { + %calltmp.i = tail call <1 x float> @__round_varying_float(<1 x float> %0) nounwind + %bincmp.i = fcmp ogt <1 x float> %calltmp.i, %0 + %val_to_boolvec32.i = sext <1 x i1> %bincmp.i to <1 x i32> + %bitop.i = and <1 x i32> %val_to_boolvec32.i, + %int_to_float_bitcast.i.i.i = bitcast <1 x i32> %bitop.i to <1 x float> + %binop.i = fadd <1 x float> %calltmp.i, %int_to_float_bitcast.i.i.i + ret <1 x float> %binop.i +} + declare @__ceil_varying_float() nounwind readnone declare @__round_varying_double() nounwind readnone @@ -246,10 +266,40 @@ define double @__min_uniform_double(double, double) nounwind readonly alwaysinl ;; min/max uniform -declare @__max_varying_float(, ) nounwind readnone -declare @__min_varying_float(, ) nounwind readnone -declare @__min_varying_int32(, ) nounwind readnone -declare @__max_varying_int32(, ) nounwind readnone +;; /* float */ +define <1 x float> @__max_varying_float(<1 x float>, <1 x float>) nounwind readonly alwaysinline { + %a = extractelement <1 x float> %0, i32 0 + %b = extractelement <1 x float> %1, i32 0 + %r = call float @__max_uniform_float(float %a, float %b) + %rv = insertelement <1 x float> undef, float %r, i32 0 + ret <1 x float> %rv +} +define <1 x float> @__min_varying_float(<1 x float>, <1 x float>) nounwind readonly alwaysinline { + %a = extractelement <1 x float> %0, i32 0 + %b = extractelement <1 x float> %1, i32 0 + %r = call float @__min_uniform_float(float %a, float %b) + %rv = insertelement <1 x float> undef, float %r, i32 0 + ret <1 x float> %rv + +} + +;; /* int32 */ +define <1 x i32> @__max_varying_int32(<1 x i32>, <1 x i32>) nounwind readonly alwaysinline { + %a = extractelement <1 x i32> %0, i32 0 + %b = extractelement <1 x i32> %1, i32 0 + %r = call i32 @__max_uniform_int32(i32 %a, i32 %b) + %rv = insertelement <1 x i32> undef, i32 %r, i32 0 + ret <1 x i32> %rv +} +define <1 x i32> @__min_varying_int32(<1 x i32>, <1 x i32>) nounwind readonly alwaysinline { + %a = extractelement <1 x i32> %0, i32 0 + %b = extractelement <1 x i32> %1, i32 0 + %r = call i32 @__min_uniform_int32(i32 %a, i32 %b) + %rv = insertelement <1 x i32> undef, i32 %r, i32 0 + ret <1 x i32> %rv +} + +;; /* uint32 */ declare @__min_varying_uint32(, ) nounwind readnone declare @__max_varying_uint32(, ) nounwind readnone ;; declare @__min_varying_int64(, ) nounwind readnone @@ -289,7 +339,13 @@ define float @__rsqrt_uniform_float(float) nounwind readonly alwaysinline declare @__rcp_varying_float() nounwind readnone declare @__rsqrt_varying_float() nounwind readnone -declare @__sqrt_varying_float() nounwind readnone +define @__sqrt_varying_float() nounwind readnone alwaysinline +{ + %v = extractelement <1 x float> %0, i32 0 + %r = call float @__sqrt_uniform_float(float %v) + %rv = insertelement <1 x float> undef, float %r, i32 0 + ret %rv +} ;; declare double @__sqrt_uniform_double(double) nounwind readnone define double @__sqrt_uniform_double(double) nounwind readonly alwaysinline { diff --git a/examples_cuda/mandelbrot_tasks3d/mandelbrot_task.o b/examples_cuda/mandelbrot_tasks3d/mandelbrot_task.o deleted file mode 100644 index d3eb8d1d5fd59f105f413fb2e45cf3d345f9a0ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8320 zcmc&(&5zs073bPc6A3-oJrpTY#1oV%(sWIWl2*HGdyUmvX=p$V7P0IYwQQM^sFh%@ z#FAWNH%ZY1Xn?ZK0zLH5Lk~ITUuYTxUZjg41=>q}Xl^;AfE)DC1}Koa0k-eG8A?Nn z`dHUSh}|LizGmjV-+MD7{`C3E501>u9aY3Nr<_;j!WZezzCCnztvs$=HiEyE zUM^iJT`pBG8E<_0$-%*a@y0(s0g;QrpG(2rQt3YeUF|i!NL3MKzo-#a}SyO_n-S<|Nij`>K?DEZ2$AxAIVm2|MMGn{;>DT zbAJLx4UGbOe*d%DUrNEprM>^0EbaaMsd8{{?~9YhZbhvbK}Ef}|JjX?_U=7hp1W6? z`xwcFv0GIu#;&ifgU(}nUmT&qT{U)JQ?DAqYibAHYibqWtN8A~dqrKx_p%ZA>UK~A z{ovQ?>oC}IV5>%Dx2)bYg16M41LecAT4r#^zOqK}p86|JTs=m_s=A80zY#Cz%0Wv# zhm^O0QUUXz^OpJ!yadNou=NCn2b}~rR_98@twDua#=0 z>!ll|`t=V`OW8DgEz54WeZTIT-Yu=`IZa}S=Je_G>C@~5t7o~UZ?#xshgB+9e#l1oY3-3`lU-ex_&FwcBzd$ZrN>Rsr~v7qVs zY0Yf4T+8$7UiTG?6$|Nf3cAuZ?0&;eN#pXGX3y^StTdbP0xPRY`Wp1=?yv;bv+0!P zn6A0Ww01t1BvB`JJv%?Eq&~A`Zf426B)K(loQ0Vs7iN|$&Mdh&v*eO2Su8Nk@m;2w zc6X!43KQb6oc><=RS1P^ZGesoz|1)3^2^2ZXG5Z=7g@$_CK0_D5j>f3V>B2`#%Qgr zxg|tL$1+=%tJ$vRbR-vHJX4uAbUDG@*_gX?FnaFpZ5Un-@pVefQ0;(k8fDcBtC#E&oOL=Z@2pzIBm>EGQ zKElGpNi9Vu1t|+zW>1d$@?cgQQFKFB2;N@b51|eD3P}qzSkS^Wq6~sY2l8el!9osC zFv$#OfIRtf*y|u^+y!C|9YY$_J3cwsSAspvpWM`}VGL_hQr;Y9-Ca3f?Q}g>>GvIG zP}ZGcWy|q9EBax~VEMez>Dn!Bi7LPXH^g%Pr=g_>wKF;-U6{&;F&oq}iWxPS)=
  • Qq#67oTrv2Krict(U{h0rjFNer8WB`U!%MtPBeWhCPw zzM^Hh02HXv+E%YC>NG$Udninu8R2c}@S3-M&F$f)Oe9tt(l6s;0=73z!NMYrWZqz* zXpb2_4sB_+p;0QJ+qEutySC*W4teXQ3meWMf^!3}hXI;)hXAgeXKY+b9Xb;xB3Rl| zEQ1Su*ihgKCy|%t*~_Ju*6Wvk1azs^>4X^IozKr?Q%?srwFOyPGdCE zRNZtm84Wek+ti?mHex{Xmyc^xR_F9MWR^0FdN!f zj3pYTP8;%pYSr{j%Anc`hVG6*#@vgQH^70suu4p+U|DY&hg? zOjZZ02(FRBy8xt2n_P^zh{hg~*(O(0vjhTSwcHZw4&^_{W!r`9QWh@|iuBAo#h$S^ z_hDCv2M8P!1)JDdK(=KTt+2$W;YzR}d8&=iWSj-5&SS@s>If--@K~O)0>N5dheJZW z+3)$?-j>y>!>+dBTIMaQ1y$*=kV#qzbg_i3Ky;)KNN$EX;GQDPk%4n2c+}f!L}Ez+ z4bxu^G9@v_5Q~YNTVtX>3_J;hfsi%98fD=0BiJAVJ>SA2|FGRD7f8en6+?tcuXz(*^3SG!l1|ItXA*uVRuuSI+%`4%=He?_!}Amkc5s&V!i$$rc|Lrx zQ8cgP`L1s^;3>TCY|^{iZ<)TSXw=FbJ>c`#Ko37y;a$E~#mnzw9~+O$Lhy`i{7x3X z{&|v9@LL*QPryIQ;vKIi`AxY1ccc$Ka0>dDv3>=4q_3|718qL2{#nq)u8zQe*s+!GIpT7{WMpguaWSWg8#?i zKkonU11+ilcSQWkz?ZLh|1wX0M!93kzYb(t_phaksv(@VMu>0G#R-c9YM3A zd=n(TA@v*L`ny1n#}tia$IuZkN%D%6=)(`S5|KXKUbtK?mGHBYf=?B5tJmx(7cZ?} zxU|!2VzqC6&-(QkoeBLnWAr-$$G;GC#0+90wEtU)j(vpm F{{iIPF^T{H diff --git a/examples_cuda/volume_rendering/Makefile b/examples_cuda/volume_rendering/Makefile index 7bb86e10..ca2d0958 100644 --- a/examples_cuda/volume_rendering/Makefile +++ b/examples_cuda/volume_rendering/Makefile @@ -2,7 +2,6 @@ EXAMPLE=volume CPP_SRC=volume.cpp volume_serial.cpp ISPC_SRC=volume.ispc -ISPC_IA_TARGETS=sse2,sse4-x2,avx -ISPC_ARM_TARGETS=neon +ISPC_IA_TARGETS=avx include ../common.mk diff --git a/examples_cuda/volume_rendering/volume.ispc b/examples_cuda/volume_rendering/volume.ispc index a60c6a42..ef79ab85 100644 --- a/examples_cuda/volume_rendering/volume.ispc +++ b/examples_cuda/volume_rendering/volume.ispc @@ -31,6 +31,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifdef __NVPTX__ +#warning "emitting DEVICE code" +#define taskIndex blockIndex0() +#define taskCount blockCount0() +#define programIndex laneIndex() +#define programCount warpSize() +#else +#warning "emitting HOST code" +#endif + + typedef float<3> float3; struct Ray { @@ -236,7 +247,7 @@ raymarch(uniform float density[], uniform int nVoxels[3], Ray ray) { // terminate once attenuation is high float atten = exp(-tau); if (atten < .005) - cbreak; + break; // direct lighting float Li = lightIntensity / distanceSquared(lightPos, pos) * diff --git a/examples_cuda/volume_rendering/volume1.ispc b/examples_cuda/volume_rendering/volume1.ispc new file mode 100644 index 00000000..67f658b7 --- /dev/null +++ b/examples_cuda/volume_rendering/volume1.ispc @@ -0,0 +1,410 @@ +/* + Copyright (c) 2011, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef __NVPTX__ +#warning "emitting DEVICE code" +#define taskIndex blockIndex0() +#define taskCount blockCount0() +#define programIndex laneIndex() +#define programCount warpSize() +#else +#warning "emitting HOST code" +#endif + + +typedef float<3> float3; + +struct Ray { + float3 origin, dir; +}; + + +static inline void +generateRay(const uniform float raster2camera[4][4], + const uniform float camera2world[4][4], + float x, float y, Ray &ray) { + // transform raster coordinate (x, y, 0) to camera space + float camx = raster2camera[0][0] * x + raster2camera[0][1] * y + raster2camera[0][3]; + float camy = raster2camera[1][0] * x + raster2camera[1][1] * y + raster2camera[1][3]; + float camz = raster2camera[2][3]; + float camw = raster2camera[3][3]; + camx /= camw; + camy /= camw; + camz /= camw; + + ray.dir.x = camera2world[0][0] * camx + camera2world[0][1] * camy + camera2world[0][2] * camz; + ray.dir.y = camera2world[1][0] * camx + camera2world[1][1] * camy + camera2world[1][2] * camz; + ray.dir.z = camera2world[2][0] * camx + camera2world[2][1] * camy + camera2world[2][2] * camz; + + ray.origin.x = camera2world[0][3] / camera2world[3][3]; + ray.origin.y = camera2world[1][3] / camera2world[3][3]; + ray.origin.z = camera2world[2][3] / camera2world[3][3]; +} + + +static inline bool +Inside(float3 p, float3 pMin, float3 pMax) { + return (p.x >= pMin.x && p.x <= pMax.x && + p.y >= pMin.y && p.y <= pMax.y && + p.z >= pMin.z && p.z <= pMax.z); +} + + +static inline bool +IntersectP(Ray ray, float3 pMin, float3 pMax, float &hit0, float &hit1) { + float t0 = -1e30, t1 = 1e30; + + float3 tNear = (pMin - ray.origin) / ray.dir; + float3 tFar = (pMax - ray.origin) / ray.dir; + if (tNear.x > tFar.x) { + float tmp = tNear.x; + tNear.x = tFar.x; + tFar.x = tmp; + } + t0 = max(tNear.x, t0); + t1 = min(tFar.x, t1); + + if (tNear.y > tFar.y) { + float tmp = tNear.y; + tNear.y = tFar.y; + tFar.y = tmp; + } + t0 = max(tNear.y, t0); + t1 = min(tFar.y, t1); + + if (tNear.z > tFar.z) { + float tmp = tNear.z; + tNear.z = tFar.z; + tFar.z = tmp; + } + t0 = max(tNear.z, t0); + t1 = min(tFar.z, t1); + + if (t0 <= t1) { + hit0 = t0; + hit1 = t1; + return true; + } + else + return false; +} + + +static inline float Lerp(float t, float a, float b) { + return (1.f - t) * a + t * b; +} + + +static inline float D(int x, int y, int z, uniform int nVoxels[3], + uniform float density[]) { + x = clamp(x, 0, nVoxels[0]-1); + y = clamp(y, 0, nVoxels[1]-1); + z = clamp(z, 0, nVoxels[2]-1); + + return density[z*nVoxels[0]*nVoxels[1] + y*nVoxels[0] + x]; +} + + +static inline float3 Offset(float3 p, float3 pMin, float3 pMax) { + return (p - pMin) / (pMax - pMin); +} + + +static inline float Density(float3 Pobj, float3 pMin, float3 pMax, + uniform float density[], uniform int nVoxels[3]) { + if (!Inside(Pobj, pMin, pMax)) + return 0; + // Compute voxel coordinates and offsets for _Pobj_ + float3 vox = Offset(Pobj, pMin, pMax); + vox.x = vox.x * nVoxels[0] - .5f; + vox.y = vox.y * nVoxels[1] - .5f; + vox.z = vox.z * nVoxels[2] - .5f; + int vx = (int)(vox.x), vy = (int)(vox.y), vz = (int)(vox.z); + float dx = vox.x - vx, dy = vox.y - vy, dz = vox.z - vz; + + // Trilinearly interpolate density values to compute local density + float d00 = Lerp(dx, D(vx, vy, vz, nVoxels, density), + D(vx+1, vy, vz, nVoxels, density)); + float d10 = Lerp(dx, D(vx, vy+1, vz, nVoxels, density), + D(vx+1, vy+1, vz, nVoxels, density)); + float d01 = Lerp(dx, D(vx, vy, vz+1, nVoxels, density), + D(vx+1, vy, vz+1, nVoxels, density)); + float d11 = Lerp(dx, D(vx, vy+1, vz+1, nVoxels, density), + D(vx+1, vy+1, vz+1, nVoxels, density)); + float d0 = Lerp(dy, d00, d10); + float d1 = Lerp(dy, d01, d11); + return Lerp(dz, d0, d1); +} + + +/* Returns the transmittance between two points p0 and p1, in a volume + with extent (pMin,pMax) with transmittance coefficient sigma_t, + defined by nVoxels[3] voxels in each dimension in the given density + array. */ +static inline float +transmittance(uniform float3 p0, float3 p1, uniform float3 pMin, + uniform float3 pMax, uniform float sigma_t, + uniform float density[], uniform int nVoxels[3]) { + float rayT0, rayT1; + Ray ray; + ray.origin = p1; + ray.dir = p0 - p1; + + // Find the parametric t range along the ray that is inside the volume. + if (!IntersectP(ray, pMin, pMax, rayT0, rayT1)) + return 1.; + + rayT0 = max(rayT0, 0.f); + + // Accumulate beam transmittance in tau + float tau = 0; + float rayLength = sqrt(ray.dir.x * ray.dir.x + ray.dir.y * ray.dir.y + + ray.dir.z * ray.dir.z); + uniform float stepDist = 0.2; + float stepT = stepDist / rayLength; + + float t = rayT0; + float3 pos = ray.origin + ray.dir * rayT0; + float3 dirStep = ray.dir * stepT; + while (t < rayT1) { + tau += stepDist * sigma_t * Density(pos, pMin, pMax, density, nVoxels); + pos = pos + dirStep; + t += stepT; + } + + return exp(-tau); +} + + +static inline float +distanceSquared(float3 a, float3 b) { + float3 d = a-b; + return d.x*d.x + d.y*d.y + d.z*d.z; +} + + +static inline float +raymarch(uniform float density[], uniform int nVoxels[3], Ray ray) { + float rayT0, rayT1; + uniform float3 pMin = {.3, -.2, .3}, pMax = {1.8, 2.3, 1.8}; + uniform float3 lightPos = { -1, 4, 1.5 }; + + if (!IntersectP(ray, pMin, pMax, rayT0, rayT1)) + return 0.; + + rayT0 = max(rayT0, 0.f); + + // Parameters that define the volume scattering characteristics and + // sampling rate for raymarching + uniform float Le = .25; // Emission coefficient + uniform float sigma_a = 10; // Absorption coefficient + uniform float sigma_s = 10; // Scattering coefficient + uniform float stepDist = 0.025; // Ray step amount + uniform float lightIntensity = 40; // Light source intensity + + float tau = 0.f; // accumulated beam transmittance + float L = 0; // radiance along the ray + float rayLength = sqrt(ray.dir.x * ray.dir.x + ray.dir.y * ray.dir.y + + ray.dir.z * ray.dir.z); + float stepT = stepDist / rayLength; + + float t = rayT0; + float3 pos = ray.origin + ray.dir * rayT0; + float3 dirStep = ray.dir * stepT; + while (t < rayT1) + { + float d = Density(pos, pMin, pMax, density, nVoxels); + + // terminate once attenuation is high + float atten = exp(-tau); + if (atten < .005) + break; + + // direct lighting + float Li = lightIntensity / distanceSquared(lightPos, pos) * + transmittance(lightPos, pos, pMin, pMax, sigma_a + sigma_s, + density, nVoxels); + L += stepDist * atten * d * sigma_s * (Li + Le); + + // update beam transmittance + tau += stepDist * (sigma_a + sigma_s) * d; + + pos = pos + dirStep; + t += stepT; + } + + // Gamma correction + return pow(L, 1.f / 2.2f); +} + + +/* Utility routine used by both the task-based and the single-core entrypoints. + Renders a tile of the image, covering [x0,x0) * [y0, y1), storing the + result into the image[] array. + */ +static inline void +volume_tile(uniform int x0, uniform int y0, uniform int x1, + uniform int y1, uniform float density[], uniform int nVoxels[3], + const uniform float raster2camera[4][4], + const uniform float camera2world[4][4], + uniform int width, uniform int height, uniform float image[]) { + // Work on 4x4=16 pixel big tiles of the image. This function thus + // implicitly assumes that both (x1-x0) and (y1-y0) are evenly divisble + // by 4. + for (uniform int y = y0; y < y1; y += 4) { + for (uniform int x = x0; x < x1; x += 4) { +// foreach (o = 0 ... 16) { + for (int ob = 0; ob < 32; ob += programCount) + { + const int o = ob + programIndex; + if (o >= 16) continue; + + + // These two arrays encode the mapping from [0,15] to + // offsets within the 4x4 pixel block so that we render + // each pixel inside the block + const uniform int xoffsets[16] = { 0, 1, 0, 1, 2, 3, 2, 3, + 0, 1, 0, 1, 2, 3, 2, 3 }; + const uniform int yoffsets[16] = { 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3 }; + + // Figure out the pixel to render for this program instance + int xo = x + xoffsets[o], yo = y + yoffsets[o]; + + // Use viewing parameters to compute the corresponding ray + // for the pixel + Ray ray; + generateRay(raster2camera, camera2world, xo, yo, ray); + + // And raymarch through the volume to compute the pixel's + // value + int offset = yo * width + xo; + image[offset] = raymarch(density, nVoxels, ray); + } + } + } +} + + +task void +volume_task(uniform float density[], uniform int _nVoxels[3], + const uniform float _raster2camera[4][4], + const uniform float _camera2world[4][4], + uniform int width, uniform int height, uniform float image[]) +{ + if (taskIndex >= taskCount) return; + +#if 1 + uniform int nVoxels[3]; + nVoxels[0] = _nVoxels[0]; + nVoxels[1] = _nVoxels[1]; + nVoxels[2] = _nVoxels[2]; + + uniform float raster2camera[4][4]; + raster2camera[0][0] = _raster2camera[0][0]; + raster2camera[0][1] = _raster2camera[0][1]; + raster2camera[0][2] = _raster2camera[0][2]; + raster2camera[0][3] = _raster2camera[0][3]; + raster2camera[1][0] = _raster2camera[1][0]; + raster2camera[1][1] = _raster2camera[1][1]; + raster2camera[1][2] = _raster2camera[1][2]; + raster2camera[1][3] = _raster2camera[1][3]; + raster2camera[2][0] = _raster2camera[2][0]; + raster2camera[2][1] = _raster2camera[2][1]; + raster2camera[2][2] = _raster2camera[2][2]; + raster2camera[2][3] = _raster2camera[2][3]; + raster2camera[3][0] = _raster2camera[3][0]; + raster2camera[3][1] = _raster2camera[3][1]; + raster2camera[3][2] = _raster2camera[3][2]; + raster2camera[3][3] = _raster2camera[3][3]; + + uniform float camera2world[4][4]; + camera2world[0][0] = _camera2world[0][0]; + camera2world[0][1] = _camera2world[0][1]; + camera2world[0][2] = _camera2world[0][2]; + camera2world[0][3] = _camera2world[0][3]; + camera2world[1][0] = _camera2world[1][0]; + camera2world[1][1] = _camera2world[1][1]; + camera2world[1][2] = _camera2world[1][2]; + camera2world[1][3] = _camera2world[1][3]; + camera2world[2][0] = _camera2world[2][0]; + camera2world[2][1] = _camera2world[2][1]; + camera2world[2][2] = _camera2world[2][2]; + camera2world[2][3] = _camera2world[2][3]; + camera2world[3][0] = _camera2world[3][0]; + camera2world[3][1] = _camera2world[3][1]; + camera2world[3][2] = _camera2world[3][2]; + camera2world[3][3] = _camera2world[3][3]; +#else +#define nVoxels _nVoxels +#define raster2camera _raster2camera +#define camera2world _camera2world +#endif + + uniform int dx = 8, dy = 8; // must match value in volume_ispc_tasks + uniform int xbuckets = (width + (dx-1)) / dx; + uniform int ybuckets = (height + (dy-1)) / dy; + + uniform int x0 = (taskIndex % xbuckets) * dx; + uniform int y0 = (taskIndex / xbuckets) * dy; + uniform int x1 = x0 + dx, y1 = y0 + dy; + x1 = min(x1, width); + y1 = min(y1, height); + + volume_tile(x0, y0, x1, y1, density, nVoxels, raster2camera, + camera2world, width, height, image); +} + + +export void +volume_ispc(uniform float density[], uniform int nVoxels[3], + const uniform float raster2camera[4][4], + const uniform float camera2world[4][4], + uniform int width, uniform int height, uniform float image[]) { + volume_tile(0, 0, width, height, density, nVoxels, raster2camera, + camera2world, width, height, image); +} + + +export void +volume_ispc_tasks(uniform float density[], uniform int nVoxels[3], + const uniform float raster2camera[4][4], + const uniform float camera2world[4][4], + uniform int width, uniform int height, uniform float image[]) { + // Launch tasks to work on (dx,dy)-sized tiles of the image + uniform int dx = 8, dy = 8; + uniform int nTasks = ((width+(dx-1))/dx) * ((height+(dy-1))/dy); + print("nTasks= %\n", nTasks); + launch[nTasks] volume_task(density, nVoxels, raster2camera, camera2world, + width, height, image); +} diff --git a/examples_cuda/volume_rendering/volume_cu.cpp b/examples_cuda/volume_rendering/volume_cu.cpp new file mode 100644 index 00000000..b020d9a7 --- /dev/null +++ b/examples_cuda/volume_rendering/volume_cu.cpp @@ -0,0 +1,478 @@ +/* + Copyright (c) 2011, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#define NOMINMAX +#pragma warning (disable: 4244) +#pragma warning (disable: 4305) +#endif + +#include +#include +#include "../timing.h" +#include "volume_ispc.h" +using namespace ispc; + +#include +#include +#include +#include "drvapi_error_string.h" + +#define checkCudaErrors(err) __checkCudaErrors (err, __FILE__, __LINE__) +// These are the inline versions for all of the SDK helper functions +void __checkCudaErrors(CUresult err, const char *file, const int line) { + if(CUDA_SUCCESS != err) { + std::cerr << "checkCudeErrors() Driver API error = " << err << "\"" + << getCudaDrvErrorString(err) << "\" from file <" << file + << ", line " << line << "\n"; + exit(-1); + } +} + +/**********************/ +/* Basic CUDriver API */ +CUcontext context; + +void createContext(const int deviceId = 0) +{ + CUdevice device; + int devCount; + checkCudaErrors(cuInit(0)); + checkCudaErrors(cuDeviceGetCount(&devCount)); + assert(devCount > 0); + checkCudaErrors(cuDeviceGet(&device, deviceId < devCount ? deviceId : 0)); + + char name[128]; + checkCudaErrors(cuDeviceGetName(name, 128, device)); + std::cout << "Using CUDA Device [0]: " << name << "\n"; + + int devMajor, devMinor; + checkCudaErrors(cuDeviceComputeCapability(&devMajor, &devMinor, device)); + std::cout << "Device Compute Capability: " + << devMajor << "." << devMinor << "\n"; + if (devMajor < 2) { + std::cerr << "ERROR: Device 0 is not SM 2.0 or greater\n"; + exit(1); + } + + // Create driver context + checkCudaErrors(cuCtxCreate(&context, 0, device)); +} +void destroyContext() +{ + checkCudaErrors(cuCtxDestroy(context)); +} + +CUmodule loadModule(const char * module) +{ + CUmodule cudaModule; + // in this branch we use compilation with parameters + const unsigned int jitNumOptions = 1; + CUjit_option *jitOptions = new CUjit_option[jitNumOptions]; + void **jitOptVals = new void*[jitNumOptions]; + // set up pointer to set the Maximum # of registers for a particular kernel + jitOptions[0] = CU_JIT_MAX_REGISTERS; + int jitRegCount = 64; + jitOptVals[0] = (void *)(size_t)jitRegCount; + +#if 0 + // set up size of compilation log buffer + jitOptions[0] = CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES; + int jitLogBufferSize = 1024; + jitOptVals[0] = (void *)(size_t)jitLogBufferSize; + + // set up pointer to the compilation log buffer + jitOptions[1] = CU_JIT_INFO_LOG_BUFFER; + char *jitLogBuffer = new char[jitLogBufferSize]; + jitOptVals[1] = jitLogBuffer; + + // set up pointer to set the Maximum # of registers for a particular kernel + jitOptions[2] = CU_JIT_MAX_REGISTERS; + int jitRegCount = 32; + jitOptVals[2] = (void *)(size_t)jitRegCount; +#endif + + checkCudaErrors(cuModuleLoadDataEx(&cudaModule, module,jitNumOptions, jitOptions, (void **)jitOptVals)); + return cudaModule; +} +void unloadModule(CUmodule &cudaModule) +{ + checkCudaErrors(cuModuleUnload(cudaModule)); +} + +CUfunction getFunction(CUmodule &cudaModule, const char * function) +{ + CUfunction cudaFunction; + checkCudaErrors(cuModuleGetFunction(&cudaFunction, cudaModule, function)); + return cudaFunction; +} + +CUdeviceptr deviceMalloc(const size_t size) +{ + CUdeviceptr d_buf; + checkCudaErrors(cuMemAlloc(&d_buf, size)); + return d_buf; +} +void deviceFree(CUdeviceptr d_buf) +{ + checkCudaErrors(cuMemFree(d_buf)); +} +void memcpyD2H(void * h_buf, CUdeviceptr d_buf, const size_t size) +{ + checkCudaErrors(cuMemcpyDtoH(h_buf, d_buf, size)); +} +void memcpyH2D(CUdeviceptr d_buf, void * h_buf, const size_t size) +{ + checkCudaErrors(cuMemcpyHtoD(d_buf, h_buf, size)); +} +#define deviceLaunch(func,nbx,nby,nbz,params) \ + checkCudaErrors(cuFuncSetCacheConfig((func), CU_FUNC_CACHE_PREFER_L1)); \ + checkCudaErrors( \ + cuLaunchKernel( \ + (func), \ + ((nbx-1)/(128/32)+1), (nby), (nbz), \ + 128, 1, 1, \ + 0, NULL, (params), NULL \ + )); + +typedef CUdeviceptr devicePtr; + + +/**************/ +#include +std::vector readBinary(const char * filename) +{ + std::vector buffer; + FILE *fp = fopen(filename, "rb"); + if (!fp ) + { + fprintf(stderr, "file %s not found\n", filename); + assert(0); + } +#if 0 + char c; + while ((c = fgetc(fp)) != EOF) + buffer.push_back(c); +#else + fseek(fp, 0, SEEK_END); + const unsigned long long size = ftell(fp); /*calc the size needed*/ + fseek(fp, 0, SEEK_SET); + buffer.resize(size); + + if (fp == NULL){ /*ERROR detection if file == empty*/ + fprintf(stderr, "Error: There was an Error reading the file %s \n",filename); + exit(1); + } + else if (fread(&buffer[0], sizeof(char), size, fp) != size){ /* if count of read bytes != calculated size of .bin file -> ERROR*/ + fprintf(stderr, "Error: There was an Error reading the file %s \n", filename); + exit(1); + } +#endif + fprintf(stderr, " read buffer of size= %d bytes \n", (int)buffer.size()); + return buffer; +} + +extern "C" +{ + + void *CUDAAlloc(void **handlePtr, int64_t size, int32_t alignment) + { + return NULL; + } + void CUDALaunch( + void **handlePtr, + const char * module_name, + const char * module_1, + const char * func_name, + void **func_args, + int countx, int county, int countz) + { + assert(module_name != NULL); + assert(module_1 != NULL); + assert(func_name != NULL); + assert(func_args != NULL); +#if 1 + const char * module = module_1; +#else + const std::vector module_str = readBinary("kernel.cubin"); + const char * module = &module_str[0]; +#endif + CUmodule cudaModule = loadModule(module); + CUfunction cudaFunction = getFunction(cudaModule, func_name); + deviceLaunch(cudaFunction, countx, county, countz, func_args); + unloadModule(cudaModule); + } + void CUDASync(void *handle) + { + checkCudaErrors(cuStreamSynchronize(0)); + } + void ISPCSync(void *handle) + { + checkCudaErrors(cuStreamSynchronize(0)); + } + void CUDAFree(void *handle) + { + } +} + +extern void volume_serial(float density[], int nVoxels[3], + const float raster2camera[4][4], + const float camera2world[4][4], + int width, int height, float image[]); + +/* Write a PPM image file with the image */ +static void +writePPM(float *buf, int width, int height, const char *fn) { + FILE *fp = fopen(fn, "wb"); + fprintf(fp, "P6\n"); + fprintf(fp, "%d %d\n", width, height); + fprintf(fp, "255\n"); + for (int i = 0; i < width*height; ++i) { + float v = buf[i] * 255.f; + if (v < 0.f) v = 0.f; + else if (v > 255.f) v = 255.f; + unsigned char c = (unsigned char)v; + for (int j = 0; j < 3; ++j) + fputc(c, fp); + } + fclose(fp); + printf("Wrote image file %s\n", fn); +} + + +/* Load image and viewing parameters from a camera data file. + FIXME: we should add support to be able to specify viewing parameters + in the program here directly. */ +static void +loadCamera(const char *fn, int *width, int *height, float raster2camera[4][4], + float camera2world[4][4]) { + FILE *f = fopen(fn, "r"); + if (!f) { + perror(fn); + exit(1); + } + if (fscanf(f, "%d %d", width, height) != 2) { + fprintf(stderr, "Unexpected end of file in camera file\n"); + exit(1); + } + + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + if (fscanf(f, "%f", &raster2camera[i][j]) != 1) { + fprintf(stderr, "Unexpected end of file in camera file\n"); + exit(1); + } + } + } + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + if (fscanf(f, "%f", &camera2world[i][j]) != 1) { + fprintf(stderr, "Unexpected end of file in camera file\n"); + exit(1); + } + } + } + fclose(f); +} + + +/* Load a volume density file. Expects the number of x, y, and z samples + as the first three values (as integer strings), then x*y*z + floating-point values (also as strings) to give the densities. */ +static float * +loadVolume(const char *fn, int n[3]) { + FILE *f = fopen(fn, "r"); + if (!f) { + perror(fn); + exit(1); + } + + if (fscanf(f, "%d %d %d", &n[0], &n[1], &n[2]) != 3) { + fprintf(stderr, "Couldn't find resolution at start of density file\n"); + exit(1); + } + + int count = n[0] * n[1] * n[2]; + float *v = new float[count]; + for (int i = 0; i < count; ++i) { + if (fscanf(f, "%f", &v[i]) != 1) { + fprintf(stderr, "Unexpected end of file at %d'th density value\n", i); + exit(1); + } + } + + return v; +} + + +int main(int argc, char *argv[]) { + if (argc != 3) { + fprintf(stderr, "usage: volume \n"); + return 1; + } + + // + // Load viewing data and the volume density data + // + int width, height; + float raster2camera[4][4], camera2world[4][4]; + loadCamera(argv[1], &width, &height, raster2camera, camera2world); + float *image = new float[width*height]; + + int n[3]; + float *density = loadVolume(argv[2], n); + + /*******************/ + createContext(); + /*******************/ + + devicePtr d_raster2camera = deviceMalloc(4*4*sizeof(float)); + devicePtr d_camera2world = deviceMalloc(4*4*sizeof(float)); + devicePtr d_n = deviceMalloc(3*sizeof(int)); + devicePtr d_density = deviceMalloc(n[0]*n[1]*n[2]*sizeof(float)); + devicePtr d_image = deviceMalloc(width*height*sizeof(float)); + + + + // + // Compute the image using the ispc implementation; report the minimum + // time of three runs. + // + double minISPC = 1e30; +#if 0 + for (int i = 0; i < 3; ++i) { + reset_and_start_timer(); + volume_ispc(density, n, raster2camera, camera2world, + width, height, image); + double dt = get_elapsed_mcycles(); + minISPC = std::min(minISPC, dt); + } + + for (int i = 0; i < width*height; i += 4) + { + if (image[i] != 0.0f) + { + fprintf(stderr, " i= %d image= %g %g %g %g \n", i, + image[i+0], + image[i+1], + image[i+2], + image[i+3]); + break; + } + } + + printf("[volume ispc 1 core]:\t\t[%.3f] million cycles\n", minISPC); + writePPM(image, width, height, "volume-ispc-1core.ppm"); +#endif + + + // Clear out the buffer + for (int i = 0; i < width * height; ++i) + image[i] = 0.; + + memcpyH2D(d_raster2camera, raster2camera, 4*4*sizeof(float)); + memcpyH2D(d_camera2world, camera2world, 4*4*sizeof(float)); + memcpyH2D(d_n, n, 3*sizeof(int)); + memcpyH2D(d_density, density, n[0]*n[1]*n[2]*sizeof(float)); + memcpyH2D(d_image, image, width*height*sizeof(float)); + + // + // Compute the image using the ispc implementation that also uses + // tasks; report the minimum time of three runs. + // + double minISPCtasks = 1e30; + for (int i = 0; i < 3; ++i) { + reset_and_start_timer(); + volume_ispc_tasks( + (float*)d_density, + (int*)d_n, + (float(*)[4])d_raster2camera, + (float(*)[4])d_camera2world, + width, height, + (float*)d_image); + double dt = get_elapsed_mcycles(); + minISPCtasks = std::min(minISPCtasks, dt); + } + + memcpyD2H(image, d_image, width*height*sizeof(float)); + for (int i = 0; i < width*height; i += 4) + { + if (image[i] != 0.0f) + { + fprintf(stderr, " i= %d image= %g %g %g %g \n", i, + image[i+0], + image[i+1], + image[i+2], + image[i+3]); + break; + } + } + + printf("[volume ispc + tasks]:\t\t[%.3f] million cycles\n", minISPCtasks); + writePPM(image, width, height, "volume-cuda.ppm"); + +#if 0 + // Clear out the buffer + for (int i = 0; i < width * height; ++i) + image[i] = 0.; + + // + // And run the serial implementation 3 times, again reporting the + // minimum time. + // + double minSerial = 1e30; + for (int i = 0; i < 3; ++i) { + reset_and_start_timer(); + volume_serial(density, n, raster2camera, camera2world, + width, height, image); + double dt = get_elapsed_mcycles(); + minSerial = std::min(minSerial, dt); + } + + printf("[volume serial]:\t\t[%.3f] million cycles\n", minSerial); + writePPM(image, width, height, "volume-serial.ppm"); + + printf("\t\t\t\t(%.2fx speedup from ISPC, %.2fx speedup from ISPC + tasks)\n", + minSerial/minISPC, minSerial / minISPCtasks); +#else + printf("\t\t\t\t %.2fx speedup from ISPC + tasks)\n", + minISPC / minISPCtasks); +#endif + + /*******************/ + destroyContext(); + /*******************/ + + return 0; +} diff --git a/examples_cuda/volume_rendering/volume_ispc.bc b/examples_cuda/volume_rendering/volume_ispc.bc deleted file mode 100644 index 4a7c47b9f51b97b46f977e621b22e3afd51ab36d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455740 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