functions: compiled vs. uncompiled version
- To: mathgroup at smc.vnet.net
- Subject: [mg94089] functions: compiled vs. uncompiled version
- From: Diego Guadagnoli <diego.guadagnoli at ph.tum.de>
- Date: Thu, 4 Dec 2008 07:17:34 -0500 (EST)
- Organization: Technische Universitaet Muenchen
Hi All, I am performing mathematica calculations involving many nested sums of the kind FUN = Sum[term[i,j,k], {i,6},{j,6},{k,2} ] or similar, where term[__] returns a complex number. Since I have many those sums, Timing is really long. Therefore I thought to implement both term[__] and FUN as compiled functions. I noticed however than in both cases Timing is not improved, actually it is worse in the compiled version. An example of the code is reported below as plain text. There are a "Needed input" and a "Functions" part. In "Functions", an example of term[__] is provided by the VUUS function, which is implemented in uncompiled (VUUS[i_, j_, k_]) and compiled form (VUUSc). This function is then called in the repeated sum "fun" (uncompiled) or respectively "func" (compiled). As you can see, the Timing in func is actually worse than in fun. Any suggestion for improving my code without translating it in FORTRAN would be very appreciated. Cheers, D %%%%%Please copy the content below to a mathematica notebook (*NEEDED INPUT*) BR[i_] := v[1] ZR[[1, i]] - v[2] ZR[[2, i]]; {g1, sW, v[1], v[2], yuRos[1], yuRos[2], yuRos[3]} = Table[Random[], {i, 7}]; AuRos = Table[RandomComplex[], {i, 3}, {j, 3}]; ZR = Table[Random[], {i, 2}, {j, 2}]; ZU = Table[RandomComplex[], {i, 6}, {j, 6}]; \[Mu]Ros = 300; (*FUNCTIONS*) VUUS[i_, j_, k_] := -(g1^2/3)*BR[k] (KroneckerDelta[i, j] + (3 - 8 sW^2)/(4 sW^2) Sum[Conjugate[ZU[[I, i]]] ZU[[I, j]], {I, 1, 3}]) - Sum[v[2] (yuRos[I])^2 ZR[[2, k]] (Conjugate[ZU[[I, i]]] ZU[[I, j]] + Conjugate[ZU[[I + 3, i]]] ZU[[I + 3, j]]), {I, 1, 3}] + Sum[1/Sqrt[2] ZR[[2, k]] (Conjugate[AuRos[[I, J]]] Conjugate[ZU[[I, i]]] ZU[[J + 3, j]] + AuRos[[I, J]] ZU[[I, j]] Conjugate[ZU[[J + 3, i]]]), {I, 1, 3}, {J, 1, 3}] + Sum[1/Sqrt[2] yuRos[I] ZR[[1, k]] (Conjugate[\[Mu]Ros] ZU[[I, j]] Conjugate[ZU[[I + 3, i]]] + \[Mu]Ros Conjugate[ZU[[I, i]]] ZU[[I + 3, j]]), {I, 1, 3}]; VUUSc = Compile[{{i, _Integer}, {j, _Integer}, {k, _Integer}}, sum1 = 0. + 0. I; Do[sum1 = sum1 + Conjugate[ZU[[ii, i]]] ZU[[ii, j]], {ii, 1, 3}]; sum2 = 0. + 0. I; Do[sum2 = sum2 + v[2] (yuRos[ii])^2 ZR[[2, k]] (Conjugate[ZU[[ii, i]]] ZU[[ii, j]] + Conjugate[ZU[[ii + 3, i]]] ZU[[ii + 3, j]]), {ii, 1, 3}]; sum3 = 0. + 0. I; Do[sum3 = sum3 + 1/Sqrt[2] ZR[[2, k]] (Conjugate[AuRos[[ii, J]]] Conjugate[ZU[[ii, i]]] ZU[[J + 3, j]] + AuRos[[ii, J]] ZU[[ii, j]] Conjugate[ZU[[J + 3, i]]]), {ii, 1, 3}, {J, 1, 3}]; sum4 = 0. + 0. I; Do[sum4 = sum4 + 1/Sqrt[2] yuRos[ii] ZR[[1, k]] (Conjugate[\[Mu]Ros] ZU[[ii, j]] Conjugate[ZU[[ii + 3, i]]] + \[Mu]Ros Conjugate[ ZU[[ii, i]]] ZU[[ii + 3, j]]), {ii, 1, 3}]; -(g1^2/3) BR[k] (KroneckerDelta[i, j] + (3 - 8 sW^2)/(4 sW^2) sum1) - sum2 + sum3 + sum4, {{BR[_], _Real}, {ZU, _Complex, 6}, {v[_], _Real}, {yuRos[_], _Real}, {ZR, _Real, 2}, {AuRos, _Complex, 3}, {\[Mu]Ros, _Complex}}]; fun = Compile[{{k, _Integer}}, sum1 = 0. + 0. I; Do[sum1 = sum1 + VUUS[l, m, k], {l, 1, 6}, {m, 1, 6}]; -sum1, {{VUUS[__], _Complex}} ]; func = Compile[{{k, _Integer}}, sum1 = 0. + 0. I; Do[sum1 = sum1 + VUUSc[l, m, k], {l, 1, 6}, {m, 1, 6}]; -sum1, {{VUUS[__], _Complex}} ]; VUUS[1, 1, 1] // Timing VUUSc[1, 1, 1] // Timing fun[1] // Timing func[1] // Timing
- Follow-Ups:
- Re: functions: compiled vs. uncompiled version
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: functions: compiled vs. uncompiled version