|
82 | 82 | "X = sparse.asarray(X, format=\"csc\")\n",
|
83 | 83 | "X_lazy = sparse.lazy(X)\n",
|
84 | 84 | "\n",
|
85 |
| - "X_X = sparse.compute(sparse.permute_dims(X_lazy, (1, 0)) @ X_lazy, verbose=True)\n", |
| 85 | + "X_X = sparse.compute(sparse.permute_dims(X_lazy, (1, 0)) @ X_lazy)\n", |
86 | 86 | "\n",
|
87 | 87 | "X_X = sparse.asarray(X_X, format=\"csc\") # move back from dense to CSC format\n",
|
88 | 88 | "\n",
|
|
171 | 171 | "finch_galley_times = []\n",
|
172 | 172 | "\n",
|
173 | 173 | "for config in configs:\n",
|
174 |
| - " B_sps = sparse.random(\n", |
175 |
| - " (config[\"I_\"], config[\"K_\"], config[\"L_\"]),\n", |
176 |
| - " density=config[\"DENSITY\"],\n", |
177 |
| - " random_state=rng,\n", |
178 |
| - " )\n", |
| 174 | + " B_shape = (config[\"I_\"], config[\"K_\"], config[\"L_\"])\n", |
| 175 | + " B_sps = sparse.random(B_shape, density=config[\"DENSITY\"], random_state=rng)\n", |
179 | 176 | " D_sps = rng.random((config[\"L_\"], config[\"J_\"]))\n",
|
180 | 177 | " C_sps = rng.random((config[\"K_\"], config[\"J_\"]))\n",
|
181 | 178 | "\n",
|
|
204 | 201 | " D = sparse.asarray(np.array(D_sps, order=\"F\"))\n",
|
205 | 202 | " C = sparse.asarray(np.array(C_sps, order=\"F\"))\n",
|
206 | 203 | "\n",
|
207 |
| - " @sparse.compiled(opt=sparse.GalleyScheduler())\n", |
208 |
| - " def mttkrp_finch(B, D, C):\n", |
| 204 | + " @sparse.compiled(opt=sparse.GalleyScheduler(), tag=sum(B_shape))\n", |
| 205 | + " def mttkrp_finch_galley(B, D, C):\n", |
209 | 206 | " return sparse.sum(B[:, :, :, None] * D[None, None, :, :] * C[None, :, None, :], axis=(1, 2))\n",
|
210 | 207 | "\n",
|
211 | 208 | " # Compile\n",
|
212 |
| - " result_finch_galley = mttkrp_finch(B, D, C)\n", |
| 209 | + " result_finch_galley = mttkrp_finch_galley(B, D, C)\n", |
213 | 210 | " # Benchmark\n",
|
214 |
| - " time_finch_galley = benchmark(mttkrp_finch, info=\"Finch\", args=[B, D, C])\n", |
| 211 | + " time_finch_galley = benchmark(mttkrp_finch_galley, info=\"Finch Galley\", args=[B, D, C])\n", |
215 | 212 | "\n",
|
216 | 213 | " # ======= Numba =======\n",
|
217 | 214 | " os.environ[sparse._ENV_VAR_NAME] = \"Numba\"\n",
|
|
276 | 273 | "configs = [\n",
|
277 | 274 | " {\"LEN\": 5000, \"DENSITY\": 0.00001},\n",
|
278 | 275 | " {\"LEN\": 10000, \"DENSITY\": 0.00001},\n",
|
| 276 | + " {\"LEN\": 15000, \"DENSITY\": 0.00001},\n", |
279 | 277 | " {\"LEN\": 20000, \"DENSITY\": 0.00001},\n",
|
280 | 278 | " {\"LEN\": 25000, \"DENSITY\": 0.00001},\n",
|
281 | 279 | " {\"LEN\": 30000, \"DENSITY\": 0.00001},\n",
|
282 | 280 | "]\n",
|
283 |
| - "size_n = [5000, 10000, 20000, 25000, 30000]\n", |
| 281 | + "size_n = [5000, 10000, 15000, 20000, 25000, 30000]\n", |
284 | 282 | "\n",
|
285 | 283 | "if CI_MODE:\n",
|
286 | 284 | " configs = configs[:1]\n",
|
|
306 | 304 | " importlib.reload(sparse)\n",
|
307 | 305 | "\n",
|
308 | 306 | " s = sparse.asarray(s_sps)\n",
|
309 |
| - " a = sparse.asarray(np.array(a_sps, order=\"F\"))\n", |
310 |
| - " b = sparse.asarray(np.array(b_sps, order=\"C\"))\n", |
| 307 | + " a = sparse.asarray(a_sps)\n", |
| 308 | + " b = sparse.asarray(b_sps)\n", |
311 | 309 | "\n",
|
312 | 310 | " @sparse.compiled(opt=sparse.DefaultScheduler())\n",
|
313 | 311 | " def sddmm_finch(s, a, b):\n",
|
314 |
| - " return sparse.sum(\n", |
315 |
| - " s[:, :, None] * (a[:, None, :] * sparse.permute_dims(b, (1, 0))[None, :, :]),\n", |
316 |
| - " axis=-1,\n", |
317 |
| - " )\n", |
| 312 | + " return s * (a @ b)\n", |
318 | 313 | "\n",
|
319 | 314 | " # Compile\n",
|
320 | 315 | " result_finch = sddmm_finch(s, a, b)\n",
|
|
327 | 322 | " importlib.reload(sparse)\n",
|
328 | 323 | "\n",
|
329 | 324 | " s = sparse.asarray(s_sps)\n",
|
330 |
| - " a = sparse.asarray(np.array(a_sps, order=\"F\"))\n", |
331 |
| - " b = sparse.asarray(np.array(b_sps, order=\"C\"))\n", |
| 325 | + " a = sparse.asarray(a_sps)\n", |
| 326 | + " b = sparse.asarray(b_sps)\n", |
332 | 327 | "\n",
|
333 |
| - " @sparse.compiled(opt=sparse.GalleyScheduler())\n", |
334 |
| - " def sddmm_finch(s, a, b):\n", |
335 |
| - " # return s * (a @ b)\n", |
336 |
| - " return sparse.sum(\n", |
337 |
| - " s[:, :, None] * (a[:, None, :] * sparse.permute_dims(b, (1, 0))[None, :, :]),\n", |
338 |
| - " axis=-1,\n", |
339 |
| - " )\n", |
| 328 | + " @sparse.compiled(opt=sparse.GalleyScheduler(), tag=LEN)\n", |
| 329 | + " def sddmm_finch_galley(s, a, b):\n", |
| 330 | + " return s * (a @ b)\n", |
340 | 331 | "\n",
|
341 | 332 | " # Compile\n",
|
342 |
| - " result_finch_galley = sddmm_finch(s, a, b)\n", |
| 333 | + " result_finch_galley = sddmm_finch_galley(s, a, b)\n", |
343 | 334 | " # Benchmark\n",
|
344 |
| - " time_finch_galley = benchmark(sddmm_finch, info=\"Finch\", args=[s, a, b])\n", |
| 335 | + " time_finch_galley = benchmark(sddmm_finch_galley, info=\"Finch Galley\", args=[s, a, b])\n", |
345 | 336 | "\n",
|
346 | 337 | " # ======= Numba =======\n",
|
347 | 338 | " print(\"numba\")\n",
|
|
402 | 393 | "plt.show()"
|
403 | 394 | ]
|
404 | 395 | },
|
| 396 | + { |
| 397 | + "cell_type": "markdown", |
| 398 | + "metadata": {}, |
| 399 | + "source": [ |
| 400 | + "## Counting Triangles" |
| 401 | + ] |
| 402 | + }, |
405 | 403 | {
|
406 | 404 | "cell_type": "code",
|
407 | 405 | "execution_count": null,
|
|
411 | 409 | "print(\"Counting Triangles Example:\\n\")\n",
|
412 | 410 | "\n",
|
413 | 411 | "configs = [\n",
|
414 |
| - " {\"LEN\": 1000, \"DENSITY\": 0.1},\n", |
415 |
| - " {\"LEN\": 2000, \"DENSITY\": 0.1},\n", |
416 |
| - " {\"LEN\": 3000, \"DENSITY\": 0.1},\n", |
417 |
| - " {\"LEN\": 4000, \"DENSITY\": 0.1},\n", |
418 |
| - " {\"LEN\": 5000, \"DENSITY\": 0.1},\n", |
| 412 | + " {\"LEN\": 10000, \"DENSITY\": 0.001},\n", |
| 413 | + " {\"LEN\": 15000, \"DENSITY\": 0.001},\n", |
| 414 | + " {\"LEN\": 20000, \"DENSITY\": 0.001},\n", |
| 415 | + " {\"LEN\": 25000, \"DENSITY\": 0.001},\n", |
| 416 | + " {\"LEN\": 30000, \"DENSITY\": 0.001},\n", |
| 417 | + " {\"LEN\": 35000, \"DENSITY\": 0.001},\n", |
| 418 | + " {\"LEN\": 40000, \"DENSITY\": 0.001},\n", |
| 419 | + " {\"LEN\": 45000, \"DENSITY\": 0.001},\n", |
| 420 | + " {\"LEN\": 50000, \"DENSITY\": 0.001},\n", |
419 | 421 | "]\n",
|
420 |
| - "size_n = [1000, 2000, 3000, 4000, 5000]\n", |
| 422 | + "size_n = [10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000]\n", |
421 | 423 | "\n",
|
422 | 424 | "if CI_MODE:\n",
|
423 | 425 | " configs = configs[:1]\n",
|
|
444 | 446 | "\n",
|
445 | 447 | " @sparse.compiled(opt=sparse.DefaultScheduler())\n",
|
446 | 448 | " def ct_finch(a):\n",
|
447 |
| - " return sparse.sum(\n", |
448 |
| - " a[:, :, None] * a[:, None, :] * sparse.permute_dims(a, (1, 0))[None, :, :],\n", |
449 |
| - " ) / sparse.asarray(6)\n", |
| 449 | + " return sparse.sum(a @ a * a) / sparse.asarray(6)\n", |
450 | 450 | "\n",
|
451 | 451 | " # Compile\n",
|
452 | 452 | " result_finch = ct_finch(a)\n",
|
|
460 | 460 | "\n",
|
461 | 461 | " a = sparse.asarray(a_sps)\n",
|
462 | 462 | "\n",
|
463 |
| - " @sparse.compiled(opt=sparse.GalleyScheduler())\n", |
464 |
| - " def ct_finch(a):\n", |
465 |
| - " return sparse.sum(\n", |
466 |
| - " a[:, :, None] * a[:, None, :] * sparse.permute_dims(a, (1, 0))[None, :, :],\n", |
467 |
| - " ) / sparse.asarray(6)\n", |
| 463 | + " @sparse.compiled(opt=sparse.GalleyScheduler(), tag=LEN)\n", |
| 464 | + " def ct_finch_galley(a):\n", |
| 465 | + " return sparse.sum(a @ a * a) / sparse.asarray(6)\n", |
468 | 466 | "\n",
|
469 | 467 | " # Compile\n",
|
470 |
| - " result_finch_galley = ct_finch(a)\n", |
| 468 | + " result_finch_galley = ct_finch_galley(a)\n", |
471 | 469 | " # Benchmark\n",
|
472 |
| - " time_finch_galley = benchmark(ct_finch, info=\"Finch\", args=[a])\n", |
| 470 | + " time_finch_galley = benchmark(ct_finch_galley, info=\"Finch Galley\", args=[a])\n", |
473 | 471 | "\n",
|
474 | 472 | " # ======= SciPy =======\n",
|
475 | 473 | " print(\"scipy\")\n",
|
|
0 commit comments