import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20asyncio%0A%20%20%20%20import%20atexit%0A%20%20%20%20import%20concurrent.futures%20as%20cf%0A%20%20%20%20import%20ctypes%0A%20%20%20%20import%20hashlib%0A%20%20%20%20import%20json%0A%20%20%20%20import%20os%0A%20%20%20%20import%20socket%0A%20%20%20%20import%20statistics%0A%20%20%20%20import%20subprocess%0A%20%20%20%20import%20sys%0A%20%20%20%20import%20time%0A%20%20%20%20import%20warnings%0A%20%20%20%20from%20functools%20import%20partial%0A%20%20%20%20from%20http.server%20import%20SimpleHTTPRequestHandler%2C%20ThreadingHTTPServer%0A%20%20%20%20from%20multiprocessing%20import%20get_context%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20from%20threading%20import%20Thread%0A%0A%20%20%20%20import%20httpx%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20requests%0A%20%20%20%20from%20numba%20import%20njit%2C%20prange%0A%20%20%20%20from%20tqdm.contrib.concurrent%20import%20thread_map%0A%0A%20%20%20%20notebook_dir%20%3D%20Path(__file__).resolve().parent%20if%20%22__file__%22%20in%20globals()%20else%20Path.cwd()%0A%20%20%20%20repo_root%20%3D%20notebook_dir.parents%5B1%5D%0A%20%20%20%20data_dir%20%3D%20repo_root%20%2F%20%22data%22%20%2F%20%22others%22%20%2F%20%22accelerated_python%22%0A%20%20%20%20data_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20warnings.filterwarnings(%0A%20%20%20%20%20%20%20%20%22ignore%22%2C%0A%20%20%20%20%20%20%20%20message%3Dr%22resource_tracker%3A%20There%20appear%20to%20be%20%5Cd%2B%20leaked%20semaphore%20objects%20to%20clean%20up%20at%20shutdown%22%2C%0A%20%20%20%20%20%20%20%20category%3DUserWarning%2C%0A%20%20%20%20)%0A%20%20%20%20warnings.filterwarnings(%0A%20%20%20%20%20%20%20%20%22ignore%22%2C%0A%20%20%20%20%20%20%20%20category%3DUserWarning%2C%0A%20%20%20%20%20%20%20%20module%3Dr%22multiprocessing%5C.resource_tracker%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20SimpleHTTPRequestHandler%2C%0A%20%20%20%20%20%20%20%20Thread%2C%0A%20%20%20%20%20%20%20%20ThreadingHTTPServer%2C%0A%20%20%20%20%20%20%20%20asyncio%2C%0A%20%20%20%20%20%20%20%20atexit%2C%0A%20%20%20%20%20%20%20%20cf%2C%0A%20%20%20%20%20%20%20%20ctypes%2C%0A%20%20%20%20%20%20%20%20data_dir%2C%0A%20%20%20%20%20%20%20%20get_context%2C%0A%20%20%20%20%20%20%20%20hashlib%2C%0A%20%20%20%20%20%20%20%20httpx%2C%0A%20%20%20%20%20%20%20%20json%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20njit%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20os%2C%0A%20%20%20%20%20%20%20%20partial%2C%0A%20%20%20%20%20%20%20%20pd%2C%0A%20%20%20%20%20%20%20%20prange%2C%0A%20%20%20%20%20%20%20%20requests%2C%0A%20%20%20%20%20%20%20%20socket%2C%0A%20%20%20%20%20%20%20%20statistics%2C%0A%20%20%20%20%20%20%20%20subprocess%2C%0A%20%20%20%20%20%20%20%20sys%2C%0A%20%20%20%20%20%20%20%20thread_map%2C%0A%20%20%20%20%20%20%20%20time%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Python%20%E9%AB%98%E9%80%9F%E5%8C%96%E3%83%A1%E3%83%A2%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%81%AE%E4%B8%BB%E8%BB%B8%E3%81%AF%E3%80%81%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B3%E3%82%A2%E3%81%A8%20CUDA%20%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E7%AE%97%E3%81%AE%E5%8A%A0%E9%80%9F%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82**%0A%20%20%20%20%E5%90%8C%E3%81%98%E8%A8%88%E7%AE%97%E3%82%92%E8%A4%87%E6%95%B0%E3%81%AE%E6%96%B9%E6%B3%95%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%A6%E5%AE%9F%E6%B8%AC%E3%81%97%E3%80%81%E3%81%A9%E3%81%93%E3%81%A7%E9%A0%AD%E6%89%93%E3%81%A1%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%8B%E3%82%92%E8%A6%8B%E3%82%8B%E3%80%82%0A%0A%20%20%20%201.%20**JIT%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB**%20%E2%80%94%20Numba%20%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%B3%E3%83%BC%E3%83%89%E3%81%B8%E8%90%BD%E3%81%A8%E3%81%99%EF%BC%88%E5%8D%98%E4%B8%80%E3%82%B3%E3%82%A2%EF%BC%89%0A%20%20%20%202.%20**%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86**%20%E2%80%94%20GIL%E3%83%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%BB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%BBasyncio%20%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%EF%BC%88%E8%A4%87%E6%95%B0%E3%82%B3%E3%82%A2%EF%BC%89%0A%20%20%20%203.%20**GPU**%20%E2%80%94%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%206%20%E9%80%9A%E3%82%8A%E3%80%81%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%9E%8D%E5%90%88%E3%80%81%E6%BC%94%E7%AE%97%E5%BE%8B%E9%80%9F%E3%81%AE%E4%BB%95%E4%BA%8B%0A%0A%20%20%20%20%E5%8D%98%E4%B8%80%E3%82%B3%E3%82%A2%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%82%B3%E3%82%A2%E3%80%81GPU%20%E3%81%B8%E3%81%A8%E5%AF%BE%E8%B1%A1%E3%82%92%E5%BA%83%E3%81%92%E3%81%A6%E3%81%84%E3%81%8F%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AF%E3%81%99%E3%81%B9%E3%81%A6%201%20%E5%8F%B0%E3%81%AE%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A7%E5%90%8C%E4%B8%80%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%86%85%E3%81%A7%E8%A1%8C%E3%81%86%E3%80%82%0A%20%20%20%20%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%81%AF%E7%92%B0%E5%A2%83%E3%81%AB%E5%BC%B7%E3%81%8F%E4%BE%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E6%B3%A8%E7%9B%AE%E3%81%99%E3%81%B9%E3%81%8D%E3%81%AF**%E6%89%8B%E6%B3%95%E3%81%A9%E3%81%86%E3%81%97%E3%81%AE%E6%AF%94**%E3%81%A8%E3%80%81%0A%20%20%20%20%E3%81%A9%E3%81%93%E3%81%A7%E9%A0%AD%E6%89%93%E3%81%A1%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E6%95%B0%E5%80%A4%E3%81%AF%E4%B8%8B%E3%81%AE%E3%80%8C%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%80%8D%E3%82%BB%E3%83%AB%E3%81%AE%E6%A7%8B%E6%88%90%E3%81%A7%E5%BE%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E9%80%9F%E3%81%95%E3%81%AE%E8%A9%B1%E3%81%A8%E5%90%8C%E3%81%98%E3%81%8F%E3%82%89%E3%81%84%E3%80%81**%E8%A8%88%E6%B8%AC%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4**%E3%82%92%E6%89%B1%E3%81%86%E3%80%82%0A%20%20%20%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%8C%E8%A8%88%E7%AE%97%E3%82%92%E6%B6%88%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E4%BE%8B%E3%80%81GPU%20%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E8%90%BD%E3%81%A1%E3%81%A6%E3%81%84%E3%82%8B%E4%BE%8B%E3%80%81%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%94%9F%E6%88%90%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%81%8C%E7%B5%90%E6%9E%9C%E3%82%92%E6%94%AF%E9%85%8D%E3%81%99%E3%82%8B%E4%BE%8B%E3%82%92%E3%80%81%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E5%AE%9F%E6%B8%AC%E3%81%97%E3%81%A6%E7%A4%BA%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%AA%E3%81%8A%E3%80%81%E8%A8%88%E7%AE%97%E3%82%88%E3%82%8A%E5%89%8D%E6%AE%B5%E3%81%A7%E5%8A%B9%E3%81%8F%E3%81%93%E3%81%A8%E3%81%AE%E5%A4%9A%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%A5%E5%87%BA%E5%8A%9B%E3%81%AF%E6%89%B1%E3%82%8F%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%81%A1%E3%82%89%E3%81%AF%E5%88%A5%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%80%8C%E3%83%87%E3%83%BC%E3%82%BF%E5%85%A5%E5%87%BA%E5%8A%9B%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96%E3%80%8D%E3%81%A7%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E8%A8%88%E6%B8%AC%E3%81%AE%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%0A%0A%20%20%20%20%E4%BB%A5%E9%99%8D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E4%BD%BF%E3%81%86%E8%A8%88%E6%B8%AC%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%82%92%202%20%E3%81%A4%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60timed_call(label%2C%20func%2C%20*args)%60%3A%20%60func%60%20%E3%82%92%20**1%20%E5%9B%9E%E3%81%A0%E3%81%91**%E5%91%BC%E3%81%B3%E3%80%81%E7%B5%8C%E9%81%8E%E7%A7%92%E6%95%B0%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%20%20%20%20%20%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E9%96%93%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%80%8C%E5%88%9D%E5%9B%9E%E3%80%8D%E3%81%AB%E6%84%8F%E5%91%B3%E3%81%8C%E3%81%82%E3%82%8B%E8%A8%88%E6%B8%AC%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20-%20%60benchmark(label%2C%20func%2C%20repeats%3D7%2C%20warmup_s%3D0.5)%60%3A%20%60warmup_s%60%20%E7%A7%92%E3%81%B6%E3%82%93%E5%9B%9E%E3%81%97%E7%B6%9A%E3%81%91%E3%81%A6%E3%81%8B%E3%82%89%0A%20%20%20%20%20%20%60repeats%60%20%E5%9B%9E%E8%A8%88%E6%B8%AC%E3%81%97%E3%80%81**%E4%B8%AD%E5%A4%AE%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4**%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%AF%20JIT%20%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A8%E3%80%81%0A%20%20%20%20%20%20GPU%20%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E7%9C%81%E9%9B%BB%E5%8A%9B%E7%8A%B6%E6%85%8B%E3%81%8B%E3%82%89%E5%BC%95%E3%81%8D%E4%B8%8A%E3%81%92%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A7%E3%80%81%E5%BE%8C%E8%80%85%E3%81%AE%E5%8A%B9%E3%81%8D%E6%96%B9%E3%81%AF%0A%20%20%20%20%20%20GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%80%8C%E8%A8%88%E6%B8%AC%E3%81%AE%E7%BD%A0%E3%80%8D%E3%81%A7%E5%AE%9F%E6%B8%AC%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%E7%B5%8C%E9%81%8E%E6%99%82%E9%96%93%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AB%20%60time.perf_counter%60%EF%BC%88%E5%8D%98%E8%AA%BF%E5%A2%97%E5%8A%A0%E3%83%BB%E9%AB%98%E5%88%86%E8%A7%A3%E8%83%BD%EF%BC%89%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%E4%B8%AD%E5%A4%AE%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4%E3%82%92%E4%B8%A1%E6%96%B9%E5%87%BA%E3%81%99%E3%81%AE%E3%81%AF%E3%80%81%E5%A4%96%E4%B9%B1%E3%81%AE%E6%B7%B7%E5%85%A5%E3%82%92%E8%A6%8B%E5%88%86%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E4%B8%A1%E8%80%85%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E9%9B%A2%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8C%E3%81%B0%E4%BB%96%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%84%E9%9B%BB%E5%8A%9B%E5%88%B6%E5%BE%A1%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%82%92%E7%96%91%E3%81%86%E3%80%82%0A%0A%20%20%20%20%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%E5%90%8C%E6%9C%9F%E9%96%A2%E6%95%B0%E3%81%97%E3%81%8B%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81asyncio%20%E3%81%AE%E7%AF%80%E3%81%A0%E3%81%91%E3%81%AF%0A%20%20%20%20%E9%9D%9E%E5%90%8C%E6%9C%9F%E7%89%88%E3%82%92%E5%88%A5%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(statistics%2C%20time)%3A%0A%20%20%20%20def%20timed_call(label%3A%20str%2C%20func%2C%20*args%2C%20**kwargs)%3A%0A%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20value%20%3D%20func(*args%2C%20**kwargs)%0A%20%20%20%20%20%20%20%20elapsed%20%3D%20time.perf_counter()%20-%20start%0A%20%20%20%20%20%20%20%20print(f%22%5B%7Blabel%7D%5D%20%7Belapsed%3A.3g%7D%20s%22)%0A%20%20%20%20%20%20%20%20return%20value%2C%20elapsed%0A%0A%20%20%20%20def%20benchmark(label%3A%20str%2C%20func%2C%20repeats%3A%20int%20%3D%207%2C%20warmup_s%3A%20float%20%3D%200.5)%3A%0A%20%20%20%20%20%20%20%20%23%20%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%80%82JIT%20%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%92%E6%B8%88%E3%81%BE%E3%81%9B%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AA%E3%81%8F%E3%80%81GPU%20%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%0A%20%20%20%20%20%20%20%20%23%20%E7%9C%81%E9%9B%BB%E5%8A%9B%E7%8A%B6%E6%85%8B%E3%81%8B%E3%82%89%E5%BC%95%E3%81%8D%E4%B8%8A%E3%81%92%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E4%B8%80%E5%AE%9A%E6%99%82%E9%96%93%E3%81%BE%E3%82%8F%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%EF%BC%88%E4%B8%8B%E3%81%AE%E3%80%8C%E8%A8%88%E6%B8%AC%E3%81%AE%E7%BD%A0%E3%80%8D%E3%82%92%E5%8F%82%E7%85%A7%EF%BC%89%0A%20%20%20%20%20%20%20%20deadline%20%3D%20time.perf_counter()%20%2B%20warmup_s%0A%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20func()%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20time.perf_counter()%20%3E%3D%20deadline%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20samples%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(repeats)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20func()%0A%20%20%20%20%20%20%20%20%20%20%20%20samples.append(time.perf_counter()%20-%20start)%0A%20%20%20%20%20%20%20%20median_s%20%3D%20statistics.median(samples)%0A%20%20%20%20%20%20%20%20best_s%20%3D%20min(samples)%0A%20%20%20%20%20%20%20%20print(f%22%5B%7Blabel%7D%5D%20median%20%7Bmedian_s%20*%201e3%3A.3f%7D%20ms%20%2F%20min%20%7Bbest_s%20*%201e3%3A.3f%7D%20ms%20(n%3D%7Brepeats%7D)%22)%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22case%22%3A%20label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22median_ms%22%3A%20median_s%20*%201e3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_ms%22%3A%20best_s%20*%201e3%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20benchmark%2C%20timed_call%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%0A%0A%20%20%20%20%E8%A8%88%E6%B8%AC%E5%80%A4%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%AF%E7%92%B0%E5%A2%83%E3%81%A7%E5%A4%89%E3%82%8F%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81CPU%20%E6%95%B0%E3%81%A8%E4%B8%BB%E8%A6%81%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E8%A8%98%E9%8C%B2%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F%E3%80%82%0A%20%20%20%20GPU%20%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%AF%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%8F%96%E3%82%89%E3%81%9A%E3%80%81GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%85%88%E9%A0%AD%E3%81%A7%E8%AA%BF%E3%81%B9%E3%82%8B%E3%80%82%E3%81%93%E3%81%86%E3%81%99%E3%82%8B%E3%81%A8%0A%20%20%20%20GPU%20%E3%82%92%E4%B8%80%E5%BA%A6%E3%82%82%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%94%9F%E6%88%90%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E6%B8%AC%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20GPU%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%BE%8C%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%EF%BC%88%E3%80%8Cfork%20%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%80%8D%E3%81%AE%E7%AF%80%EF%BC%89%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(os%2C%20pd)%3A%0A%20%20%20%20import%20cuda.core%20as%20ccore%0A%20%20%20%20import%20cupy%20as%20cp%0A%20%20%20%20import%20numba%0A%20%20%20%20import%20numba_cuda%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20triton%0A%20%20%20%20from%20numba%20import%20cuda%20as%20nbcuda%0A%0A%20%20%20%20%23%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20import%20%E3%81%A8%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%8F%96%E5%BE%97%E3%81%A0%E3%81%91%E3%82%92%E8%A1%8C%E3%81%84%E3%80%81CUDA%20%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%AF%E3%81%97%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%23%20%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%E3%81%A8%E5%BE%8C%E6%AE%B5%E3%81%AE%20fork%20%E3%81%8C%E9%AB%98%E3%81%8F%E3%81%A4%E3%81%8F%E3%81%9F%E3%82%81%E3%80%81GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%85%88%E9%A0%AD%E3%81%BE%E3%81%A7%E9%81%85%E3%82%89%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%20environment_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22CPU%20count%22%2C%20%22value%22%3A%20str(os.cpu_count())%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22numba%22%2C%20%22value%22%3A%20numba.__version__%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22numba-cuda%22%2C%20%22value%22%3A%20numba_cuda.__version__%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22cupy%22%2C%20%22value%22%3A%20cp.__version__%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22triton%22%2C%20%22value%22%3A%20triton.__version__%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22torch%22%2C%20%22value%22%3A%20torch.__version__%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22item%22%3A%20%22cuda.core%22%2C%20%22value%22%3A%20ccore.__version__%7D%2C%0A%20%20%20%20%5D%0A%20%20%20%20pd.DataFrame(environment_rows)%0A%20%20%20%20return%20ccore%2C%20cp%2C%20nbcuda%2C%20torch%2C%20triton%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Numba%20%E3%81%AB%E3%82%88%E3%82%8B%20JIT%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%0A%0A%20%20%20%20%23%23%23%20%E9%A1%8C%E6%9D%90%EF%BC%9A%E9%9D%9E%E7%B7%9A%E5%BD%A2%E3%81%AA%E7%B8%AE%E7%B4%84%0A%0A%20%20%20%20JIT%20%E3%81%AE%E5%8A%B9%E3%81%8D%E6%96%B9%E3%82%92%E8%A6%8B%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%80%811%20%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E9%9D%9E%E7%B7%9A%E5%BD%A2%E3%81%AA%E7%B8%AE%E7%B4%84%0A%20%20%20%20%24%5Csum_i%20(%5Csin%5E2%20x_i%20%2B%20%5Csqrt%7Bx_i%7D)%24%20%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%E8%A6%81%E7%B4%A0%E6%95%B0%E3%81%AF%20100%20%E4%B8%87%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%201%20%E3%81%A4%E3%81%AE%E9%A1%8C%E6%9D%90%E3%81%A7%E3%80%81%E6%AC%A1%E3%81%AE%204%20%E3%81%A4%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E6%AF%94%E3%81%B9%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%E7%B4%A0%E3%81%AE%20Python%20%E3%83%AB%E3%83%BC%E3%83%97%0A%20%20%20%20-%20NumPy%20%E3%81%AB%E3%82%88%E3%82%8B%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%8C%96%0A%20%20%20%20-%20Numba%20%E3%81%AE%20**%E9%81%85%E5%BB%B6%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB**%EF%BC%88%E5%9E%8B%E6%8C%87%E5%AE%9A%E3%81%AA%E3%81%97%EF%BC%89%E3%81%A8**%E4%BA%8B%E5%89%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB**%EF%BC%88%E3%82%B7%E3%82%B0%E3%83%8D%E3%83%81%E3%83%A3%E6%8C%87%E5%AE%9A%EF%BC%89%0A%20%20%20%20-%20Numba%20%E3%81%AE%20**%E4%B8%A6%E5%88%97%E5%8C%96**%EF%BC%88%60parallel%3DTrue%60%EF%BC%89%0A%0A%20%20%20%20%60%40njit%60%20%E3%81%AF%20Python%20%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%20LLVM%20%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%B3%E3%83%BC%E3%83%89%E3%81%B8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%9E%8B%E6%8C%87%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%E9%81%85%E5%BB%B6%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%E6%9C%80%E5%88%9D%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A7%E5%BC%95%E6%95%B0%E3%81%AE%E5%9E%8B%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%8B%E3%82%89%0A%20%20%20%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%88%9D%E5%9B%9E%E3%81%A0%E3%81%91%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E9%96%93%E3%81%8C%E4%B9%97%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AB%20%60%22float64(float64%5B%3A%5D)%22%60%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%82%B7%E3%82%B0%E3%83%8D%E3%83%81%E3%83%A3%E3%82%92%E6%9B%B8%E3%81%8F%E4%BA%8B%E5%89%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E8%A9%95%E4%BE%A1%E3%81%AE%E6%99%82%E7%82%B9%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%8C%E7%B5%82%E3%82%8F%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E5%88%9D%E5%9B%9E%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%8B%E3%82%89%E9%80%9F%E3%81%84%E3%80%82%0A%20%20%20%20%E8%A1%A8%E3%81%AE%20%60lazy_njit_first%60%20%E3%81%A8%20%60typed_njit_first%60%20%E3%81%AE%E5%B7%AE%E3%81%8C%E3%81%9D%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E9%96%93%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60*_first%60%20%E3%81%AE%E8%A1%8C%E3%81%AF%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E9%96%93%E3%82%92%E8%A6%8B%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%82%E3%81%AE%E3%81%AA%E3%81%AE%E3%81%A7%201%20%E5%9B%9E%E3%81%A0%E3%81%91%E6%B8%AC%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AE%E8%A1%8C%E3%81%AF%20%60benchmark%60%20%E3%81%A7%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E5%9B%9E%E6%B8%AC%E3%81%A3%E3%81%9F%E5%AE%9A%E5%B8%B8%E7%8A%B6%E6%85%8B%E3%81%AE%E5%80%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E6%9C%80%E5%88%9D%E3%81%AE%201%20%E5%9B%9E%E3%81%A0%E3%81%91%E3%82%92%E6%B8%AC%E3%82%8B%E3%81%A8%E3%80%81%E9%85%8D%E5%88%97%E3%81%AE%E5%88%9D%E5%9B%9E%E7%A2%BA%E4%BF%9D%E3%82%84%E4%B8%A6%E5%88%97%E7%89%88%E3%81%AE%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E8%B5%B7%E5%8B%95%E3%81%8C%E6%B7%B7%E3%81%96%E3%81%A3%E3%81%A6%0A%20%20%20%20%E5%AE%9F%E5%8A%9B%E3%82%88%E3%82%8A%E9%81%85%E3%81%8F%E5%87%BA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(benchmark%2C%20njit%2C%20np%2C%20pd%2C%20prange%2C%20timed_call)%3A%0A%20%20%20%20import%20math%0A%0A%20%20%20%20REDUCE_SIZE%20%3D%201_000_000%0A%20%20%20%20reduce_input%20%3D%20np.linspace(0.1%2C%2010.0%2C%20REDUCE_SIZE)%0A%0A%20%20%20%20def%20reduce_python(values)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20value%20in%20values%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20math.sin(value)%20**%202%20%2B%20math.sqrt(value)%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20def%20reduce_numpy(values)%3A%0A%20%20%20%20%20%20%20%20return%20float((np.sin(values)%20**%202%20%2B%20np.sqrt(values)).sum())%0A%0A%20%20%20%20%40njit(cache%3DFalse)%0A%20%20%20%20def%20reduce_lazy(values)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20index%20in%20range(values.size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20math.sin(values%5Bindex%5D)%20**%202%20%2B%20math.sqrt(values%5Bindex%5D)%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20%40njit(%22float64(float64%5B%3A%5D)%22%2C%20cache%3DFalse)%0A%20%20%20%20def%20reduce_eager(values)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20index%20in%20range(values.size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20math.sin(values%5Bindex%5D)%20**%202%20%2B%20math.sqrt(values%5Bindex%5D)%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20%40njit(%22float64(float64%5B%3A%5D)%22%2C%20cache%3DFalse%2C%20parallel%3DTrue%2C%20fastmath%3DTrue)%0A%20%20%20%20def%20reduce_parallel(values)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20index%20in%20prange(values.size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20math.sin(values%5Bindex%5D)%20**%202%20%2B%20math.sqrt(values%5Bindex%5D)%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20answer_py%2C%20elapsed_py%20%3D%20timed_call(%22python%20loop%22%2C%20reduce_python%2C%20reduce_input)%0A%20%20%20%20answer_lazy%2C%20lazy_first%20%3D%20timed_call(%22lazy%20njit%201st%20(compile%20included)%22%2C%20reduce_lazy%2C%20reduce_input)%0A%20%20%20%20answer_eager%2C%20eager_first%20%3D%20timed_call(%22typed%20njit%201st%22%2C%20reduce_eager%2C%20reduce_input)%0A%0A%20%20%20%20%23%20%E5%AE%9A%E5%B8%B8%E7%8A%B6%E6%85%8B%E3%81%AF%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E5%9B%9E%E6%B8%AC%E3%82%8B%EF%BC%881%20%E5%9B%9E%E3%81%A0%E3%81%91%E3%81%A0%E3%81%A8%E5%88%9D%E5%9B%9E%E3%81%AE%E7%A2%BA%E4%BF%9D%E3%82%84%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E8%B5%B7%E5%8B%95%E3%81%8C%E4%B9%97%E3%82%8B%EF%BC%89%0A%20%20%20%20steady%20%3D%20%7B%0A%20%20%20%20%20%20%20%20row%5B%22case%22%5D%3A%20row%5B%22min_ms%22%5D%20%2F%201e3%0A%20%20%20%20%20%20%20%20for%20row%20in%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20benchmark(%22python%20loop%22%2C%20lambda%3A%20reduce_python(reduce_input)%2C%20repeats%3D3%2C%20warmup_s%3D0.1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20benchmark(%22numpy%20vectorised%22%2C%20lambda%3A%20reduce_numpy(reduce_input)%2C%20repeats%3D3%2C%20warmup_s%3D0.1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20benchmark(%22lazy%20njit%22%2C%20lambda%3A%20reduce_lazy(reduce_input)%2C%20repeats%3D3%2C%20warmup_s%3D0.1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20benchmark(%22typed%20njit%22%2C%20lambda%3A%20reduce_eager(reduce_input)%2C%20repeats%3D3%2C%20warmup_s%3D0.1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20benchmark(%22njit%20parallel%22%2C%20lambda%3A%20reduce_parallel(reduce_input)%2C%20repeats%3D3%2C%20warmup_s%3D0.1)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%7D%0A%20%20%20%20answer_np%20%3D%20reduce_numpy(reduce_input)%0A%20%20%20%20answer_reduce_par%20%3D%20reduce_parallel(reduce_input)%0A%20%20%20%20pd.DataFrame(%5B%0A%20%20%20%20%20%20%20%20%7B%22case%22%3A%20case%2C%20%22answer%22%3A%20answer%2C%20%22elapsed_s%22%3A%20elapsed%2C%20%22speedup_vs_python%22%3A%20steady%5B%22python%20loop%22%5D%20%2F%20elapsed%7D%0A%20%20%20%20%20%20%20%20for%20case%2C%20answer%2C%20elapsed%20in%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22python%22%2C%20answer_py%2C%20steady%5B%22python%20loop%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22numpy%22%2C%20answer_np%2C%20steady%5B%22numpy%20vectorised%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22lazy_njit_first%22%2C%20answer_lazy%2C%20lazy_first)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22lazy_njit_steady%22%2C%20answer_lazy%2C%20steady%5B%22lazy%20njit%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22typed_njit_first%22%2C%20answer_eager%2C%20eager_first)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22typed_njit_steady%22%2C%20answer_eager%2C%20steady%5B%22typed%20njit%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22njit_parallel%22%2C%20answer_reduce_par%2C%20steady%5B%22njit%20parallel%22%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%AA%AD%E3%81%BF%E6%96%B9%E3%81%AE%E8%A6%81%E7%82%B9%E3%81%AF%203%20%E3%81%A4%E3%80%82%0A%0A%20%20%20%201.%20**%60lazy_njit_first%60%20%E3%81%A0%E3%81%91%E3%81%8C%E7%AA%81%E5%87%BA%E3%81%97%E3%81%A6%E9%81%85%E3%81%84%E3%80%82**%20%E3%81%93%E3%82%8C%E3%81%8C%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E9%96%93%E3%81%A7%E3%80%81%0A%20%20%20%20%20%20%202%20%E5%9B%9E%E7%9B%AE%E4%BB%A5%E9%99%8D%E3%81%AF%E6%B6%88%E3%81%88%E3%82%8B%E3%80%82%E4%BA%8B%E5%89%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%AF%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AE%E8%A9%95%E4%BE%A1%E6%99%82%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%8C%0A%20%20%20%20%20%20%20%E6%B8%88%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%811%20%E5%9B%9E%E7%9B%AE%E3%81%8B%E3%82%89%202%20%E5%9B%9E%E7%9B%AE%E3%81%A8%E5%90%8C%E3%81%98%E9%80%9F%E3%81%95%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%202.%20**NumPy%20%E3%82%88%E3%82%8A%20njit%20%E3%81%AE%E3%81%BB%E3%81%86%E3%81%8C%E9%80%9F%E3%81%84%E3%80%82**%20NumPy%20%E3%81%AF%20%60np.sin(values)%60%E3%80%81%60np.sqrt(values)%60%20%E3%81%A8%0A%20%20%20%20%20%20%20%E6%AE%B5%E9%9A%8E%E3%81%94%E3%81%A8%E3%81%AB%E4%B8%AD%E9%96%93%E9%85%8D%E5%88%97%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%E3%81%9D%E3%81%AE%E3%81%9F%E3%81%B3%E3%81%AB%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E5%BE%80%E5%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20njit%20%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AF%201%20%E8%A6%81%E7%B4%A0%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A0%E3%82%89%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%A8%88%E7%AE%97%E3%81%97%E3%81%A6%E8%B6%B3%E3%81%97%E8%BE%BC%E3%82%80%E3%81%AE%E3%81%A7%E3%80%81%E4%B8%AD%E9%96%93%E9%85%8D%E5%88%97%E3%81%8C%E8%A6%81%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%20%20%20**%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%8C%96%E3%81%AF%E9%80%9F%E3%81%84%E3%81%8C%E6%9C%80%E9%80%9F%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84**%E3%80%81%E3%81%A8%E3%81%84%E3%81%86%E7%82%B9%E3%81%AF%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F%E4%BE%A1%E5%80%A4%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%203.%20**%60answer%60%20%E5%88%97%E3%81%8C%E5%85%A8%E6%89%8B%E6%B3%95%E3%81%A7%E4%B8%80%E8%87%B4%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82**%20%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%A7%E6%84%8F%E5%91%B3%E3%81%8C%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E8%A8%BC%E6%8B%A0%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20%60fastmath%3DTrue%60%20%E3%81%AF%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E3%81%AE%E7%B5%90%E5%90%88%E5%89%87%E3%81%AE%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E3%82%92%E8%A8%B1%E3%81%99%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%20%20%20%E4%B8%A6%E5%88%97%E7%89%88%E3%81%AE%E5%80%A4%E3%81%AF%E4%B8%8B%E4%BD%8D%E6%A1%81%E3%81%A7%E4%BB%96%E3%81%A8%E3%82%8F%E3%81%9A%E3%81%8B%E3%81%AB%E7%95%B0%E3%81%AA%E3%82%8A%E3%81%86%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E8%A8%88%E6%B8%AC%E3%81%AE%E7%BD%A0%EF%BC%9A%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%8C%E8%A8%88%E7%AE%97%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E6%B6%88%E3%81%99%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AF%202%20%E9%87%8D%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E7%B7%8F%E5%92%8C%E3%82%92%E7%B4%A0%E3%81%AE%20Python%E3%83%BB%60%40njit%60%E3%83%BB%60%40njit(parallel%3DTrue%2C%20fastmath%3DTrue)%60%20%E3%81%A7%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%9F%E3%81%A0%E3%81%97**%E3%83%AB%E3%83%BC%E3%83%97%E6%9C%AC%E4%BD%93%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%8C%E3%81%84%E3%82%8B**%E3%80%82%0A%0A%20%20%20%20%E6%9C%80%E5%88%9D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E3%83%AB%E3%83%BC%E3%83%97%E6%9C%AC%E4%BD%93%E3%82%92%20%60total%20%2B%3D%20i%20-%20j%60%20%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E3%81%93%E3%81%AE%E7%B7%8F%E5%92%8C%E3%81%AF%20%24i%24%20%E3%81%A8%20%24j%24%20%E3%81%AE%E5%AF%BE%E7%A7%B0%E6%80%A7%E3%81%8B%E3%82%89%0A%20%20%20%20%E6%81%92%E7%AD%89%E7%9A%84%E3%81%AB%200%20%E3%81%A7%E3%80%81LLVM%20%E3%81%AF%E3%83%AB%E3%83%BC%E3%83%97%E5%85%A8%E4%BD%93%E3%82%92%E5%AE%9A%E6%95%B0%E3%81%B8%E7%95%B3%E3%82%93%E3%81%A7%E3%81%97%E3%81%BE%E3%81%86%E3%80%82%0A%20%20%20%20%E7%B5%90%E6%9E%9C%E3%81%A8%E3%81%97%E3%81%A6%20%60%40njit%60%20%E7%89%88%E3%81%AE%E6%89%80%E8%A6%81%E6%99%82%E9%96%93%E3%81%AF%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%80%81%0A%20%20%20%20%E8%A6%8B%E3%81%8B%E3%81%91%E4%B8%8A%E3%81%82%E3%82%8A%E3%81%88%E3%81%AA%E3%81%84%E9%80%9F%E5%BA%A6%E3%81%8C%E5%87%BA%E3%82%8B%E3%80%82%604000%20*%204000%20%3D%201600%60%20%E4%B8%87%E5%9B%9E%E3%81%AE%E5%8F%8D%E5%BE%A9%E3%81%8C%E6%95%B0%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E7%A7%92%E3%80%81%0A%20%20%20%20%E6%AF%8E%E7%A7%92%201000%20Giter%20%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E8%A8%88%E7%AE%97%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%821%20%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%81%AB%201%20%E5%8F%8D%E5%BE%A9%E3%81%93%E3%81%AA%E3%81%9B%E3%81%9F%E3%81%A8%E3%81%97%E3%81%A6%E3%82%82%0A%20%20%20%20%E6%95%B0%20GHz%20%E3%81%AE%20CPU%20%E3%81%A7%E3%81%AF%E6%AF%8E%E7%A7%92%E6%95%B0%20Giter%20%E3%81%8C%E4%B8%8A%E9%99%90%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81**%E5%8F%8D%E5%BE%A9%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84**%E3%81%93%E3%81%A8%E3%81%AF%E6%95%B0%E5%AD%97%E3%81%A0%E3%81%91%E3%81%A7%E5%88%86%E3%81%8B%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E8%A8%88%E7%AE%97%E3%81%8C%E6%B6%88%E3%81%88%E3%81%9F%E3%81%93%E3%81%A8%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%202%20%E7%95%AA%E7%9B%AE%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E3%83%AB%E3%83%BC%E3%83%97%E6%9C%AC%E4%BD%93%E3%82%92%20%60total%20%2B%3D%20(i%20*%20j)%20%25%207%60%20%E3%81%AB%E5%A4%89%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%89%B0%E4%BD%99%E3%81%8C%E5%85%A5%E3%82%8B%E3%81%A8%E9%96%89%E3%81%98%E3%81%9F%E5%BD%A2%E3%81%AB%E7%95%B3%E3%82%81%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%83%AB%E3%83%BC%E3%83%97%E3%81%8C%E5%9B%9E%E3%81%A3%E3%81%9F%E4%B8%8A%E3%81%A7%E3%81%AE%E9%80%9F%E5%BA%A6%E3%81%8C%E6%B8%AC%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AF%E3%80%81**%E7%B5%90%E6%9E%9C%E3%81%8C%E5%85%A5%E5%8A%9B%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%80%81%E3%81%8B%E3%81%A4%E9%96%89%E3%81%98%E3%81%9F%E5%BD%A2%E3%82%92%E6%8C%81%E3%81%9F%E3%81%AA%E3%81%84**%E6%9C%AC%E4%BD%93%E3%82%92%E9%81%B8%E3%81%B6%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(njit%2C%20pd%2C%20prange%2C%20timed_call)%3A%0A%20%20%20%20def%20folded_sum(size%3A%20int)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20i%20-%20j%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20%40njit(%22int64(int64)%22%2C%20cache%3DFalse)%0A%20%20%20%20def%20folded_sum_njit(size)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20i%20-%20j%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20%40njit(%22int64(int64)%22%2C%20cache%3DFalse%2C%20parallel%3DTrue%2C%20fastmath%3DTrue)%0A%20%20%20%20def%20folded_sum_parallel(size)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20prange(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20i%20-%20j%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20loop_size%20%3D%204000%0A%20%20%20%20_%2C%20folded_python%20%3D%20timed_call(%22folded%20python%22%2C%20folded_sum%2C%20loop_size)%0A%20%20%20%20_%2C%20folded_njit%20%3D%20timed_call(%22folded%20njit%22%2C%20folded_sum_njit%2C%20loop_size)%0A%20%20%20%20_%2C%20folded_par%20%3D%20timed_call(%22folded%20parallel%22%2C%20folded_sum_parallel%2C%20loop_size)%0A%20%20%20%20pd.DataFrame(%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22case%22%3A%20case%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22elapsed_s%22%3A%20elapsed%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Giter_per_s%22%3A%20loop_size**2%20%2F%20elapsed%20%2F%201e9%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20for%20case%2C%20elapsed%20in%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22python%22%2C%20folded_python)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22njit%22%2C%20folded_njit)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22njit%20parallel%2Bfastmath%22%2C%20folded_par)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%60njit%60%20%E5%88%97%E3%81%AE%20%60Giter_per_s%60%20%E3%81%8C%E7%8F%BE%E5%AE%9F%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E5%B8%AF%E5%9F%9F%E3%83%BB%E5%91%BD%E4%BB%A4%E7%99%BA%E8%A1%8C%E7%8E%87%E3%81%8B%E3%82%89%E6%A1%81%E9%81%95%E3%81%84%E3%81%AB%E5%A4%96%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8C%E3%81%B0%E3%80%81%0A%20%20%20%20%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%9F%E5%8D%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E6%AC%A1%E3%81%AF%E7%95%B3%E3%81%BF%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%9C%AC%E4%BD%93%E3%81%A7%E6%B8%AC%E3%82%8A%E7%9B%B4%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(njit%2C%20pd%2C%20prange%2C%20timed_call)%3A%0A%20%20%20%20def%20mod_sum(size%3A%20int)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20(i%20*%20j)%20%25%207%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20%40njit(%22int64(int64)%22%2C%20cache%3DFalse)%0A%20%20%20%20def%20mod_sum_njit(size)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20(i%20*%20j)%20%25%207%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20%40njit(%22int64(int64)%22%2C%20cache%3DFalse%2C%20parallel%3DTrue%2C%20fastmath%3DTrue)%0A%20%20%20%20def%20mod_sum_parallel(size)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20prange(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20(i%20*%20j)%20%25%207%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20mod_size%20%3D%204000%0A%20%20%20%20answer_python%2C%20elapsed_python%20%3D%20timed_call(%22mod%20python%22%2C%20mod_sum%2C%20mod_size)%0A%20%20%20%20answer_njit%2C%20elapsed_njit%20%3D%20timed_call(%22mod%20njit%22%2C%20mod_sum_njit%2C%20mod_size)%0A%20%20%20%20answer_par%2C%20elapsed_par%20%3D%20timed_call(%22mod%20parallel%22%2C%20mod_sum_parallel%2C%20mod_size)%0A%20%20%20%20pd.DataFrame(%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22case%22%3A%20case%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22answer%22%3A%20answer%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22elapsed_s%22%3A%20elapsed%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Giter_per_s%22%3A%20mod_size**2%20%2F%20elapsed%20%2F%201e9%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22speedup_vs_python%22%3A%20elapsed_python%20%2F%20elapsed%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20for%20case%2C%20answer%2C%20elapsed%20in%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22python%22%2C%20answer_python%2C%20elapsed_python)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22njit%22%2C%20answer_njit%2C%20elapsed_njit)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22njit%20parallel%2Bfastmath%22%2C%20answer_par%2C%20elapsed_par)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%81%A1%E3%82%89%E3%81%A7%E3%82%82%20%60answer%60%20%E5%88%97%E3%81%AF%203%20%E6%89%8B%E6%B3%95%E3%81%A7%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E6%95%B4%E6%95%B0%E6%BC%94%E7%AE%97%E3%81%AA%E3%81%AE%E3%81%A7%20%60fastmath%3DTrue%60%20%E3%81%AF%E5%8A%B9%E3%81%8B%E3%81%9A%E3%80%81%E5%8A%B9%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%20%60prange%60%20%E3%81%AB%E3%82%88%E3%82%8B%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%A0%E3%81%91%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86%0A%0A%20%20%20%20%23%23%23%20GIL%20%E3%81%A8%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%BB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%0A%0A%20%20%20%20CPython%20%E3%81%AE%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%20GIL%EF%BC%88%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E3%83%AD%E3%83%83%E3%82%AF%EF%BC%89%E3%81%AB%E5%AE%88%E3%82%89%E3%82%8C%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20**%E7%B4%94%E7%B2%8B%E3%81%AA%20Python%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%A6%E3%82%82%E9%80%9F%E3%81%8F%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84**%E3%80%82%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%88%86%E3%81%91%E3%82%8C%E3%81%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E3%81%94%E3%81%A8%E5%88%86%E3%81%8B%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%20GIL%20%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E9%A1%8C%E6%9D%90%E3%81%AF%E5%89%8D%E5%8D%8A%E3%81%A7%E3%82%82%E4%BD%BF%E3%81%A3%E3%81%9F%E4%BA%8C%E9%87%8D%E3%83%AB%E3%83%BC%E3%83%97%20%60(i%20*%20j)%20%25%207%60%20%E3%81%AE%E7%B7%8F%E5%92%8C%EF%BC%88%E7%B4%A0%E3%81%AE%20Python%20%E7%89%88%EF%BC%89%E3%82%92%204%20%E6%9C%AC%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%92%E9%80%90%E6%AC%A1%E3%83%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%204%20%E6%9C%AC%E3%83%BB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%204%20%E5%80%8B%E3%81%A7%E8%B5%B0%E3%82%89%E3%81%9B%E3%81%A6%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E7%94%9F%E6%88%90%E3%81%AB%E3%81%AF%20%60multiprocessing%60%20%E3%81%AE%20%60fork%60%20%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%0A%20%20%20%20**%60Process%60%20%E3%81%A8%20%60ProcessPoolExecutor%60%20%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%8C%E3%81%84%E3%82%8B**%E3%80%82%0A%0A%20%20%20%20-%20%60fork%60%20%E3%81%AE%20%60Process(target%3D...)%60%20%E3%81%AF%E3%80%81%E8%A6%AA%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%AD%90%E3%81%B8%E5%BC%95%E3%81%8D%E7%B6%99%E3%81%90%E3%81%AE%E3%81%A7%0A%20%20%20%20%20%20%E9%96%A2%E6%95%B0%E3%82%92%20pickle%20%E3%81%97%E3%81%AA%E3%81%84%E3%80%82marimo%20%E3%81%AE%E3%82%BB%E3%83%AB%E5%86%85%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E9%96%A2%E6%95%B0%E3%82%82%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%B8%A1%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%60ProcessPoolExecutor%60%20%E3%81%AF%20start%20method%20%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%89%E3%81%9A%E3%80%81%E6%8A%95%E5%85%A5%E3%81%99%E3%82%8B%20callable%20%E3%81%A8%E5%BC%95%E6%95%B0%E3%82%92%0A%20%20%20%20%20%20%E3%82%AD%E3%83%A5%E3%83%BC%E7%B5%8C%E7%94%B1%E3%81%A7%20pickle%20%E3%81%99%E3%82%8B%E3%80%82%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6**%E3%82%BB%E3%83%AB%E5%86%85%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E9%96%A2%E6%95%B0%E3%81%AF%20fork%20%E3%81%A7%E3%82%82%E6%B8%A1%E3%81%9B%E3%81%AA%E3%81%84**%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%8C%20%60Process%60%20%E3%82%92%E7%9B%B4%E6%8E%A5%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%93%E3%81%AE%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82fork%20%E3%81%AF%20Linux%20%E3%81%A7%E3%81%AE%E3%81%BF%E4%BD%BF%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cf%2C%20get_context%2C%20pd%2C%20time)%3A%0A%20%20%20%20def%20gil_bound_work(size)%3A%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(size)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20(i%20*%20j)%20%25%207%0A%20%20%20%20%20%20%20%20return%20total%0A%0A%20%20%20%20GIL_TASKS%20%3D%20%5B1600%5D%20*%204%0A%0A%20%20%20%20def%20measure(func)%3A%0A%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20func()%0A%20%20%20%20%20%20%20%20return%20time.perf_counter()%20-%20start%0A%0A%20%20%20%20def%20run_sequential()%3A%0A%20%20%20%20%20%20%20%20return%20%5Bgil_bound_work(size)%20for%20size%20in%20GIL_TASKS%5D%0A%0A%20%20%20%20def%20run_threads()%3A%0A%20%20%20%20%20%20%20%20with%20cf.ThreadPoolExecutor(max_workers%3D4)%20as%20executor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20list(executor.map(gil_bound_work%2C%20GIL_TASKS))%0A%0A%20%20%20%20def%20run_processes()%3A%0A%20%20%20%20%20%20%20%20context%20%3D%20get_context(%22fork%22)%0A%20%20%20%20%20%20%20%20processes%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20context.Process(target%3Dgil_bound_work%2C%20args%3D(size%2C))%20for%20size%20in%20GIL_TASKS%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20for%20process%20in%20processes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20process.start()%0A%20%20%20%20%20%20%20%20for%20process%20in%20processes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20process.join()%0A%20%20%20%20%20%20%20%20%20%20%20%20process.close()%0A%0A%20%20%20%20gil_sequential%20%3D%20measure(run_sequential)%0A%20%20%20%20gil_threads%20%3D%20measure(run_threads)%0A%20%20%20%20gil_processes%20%3D%20measure(run_processes)%0A%20%20%20%20pd.DataFrame(%5B%0A%20%20%20%20%20%20%20%20%7B%22strategy%22%3A%20%22sequential%22%2C%20%22elapsed_s%22%3A%20gil_sequential%2C%20%22speedup%22%3A%201.0%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22strategy%22%3A%20%22ThreadPoolExecutor(4)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22elapsed_s%22%3A%20gil_threads%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22speedup%22%3A%20gil_sequential%20%2F%20gil_threads%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22strategy%22%3A%20%22fork%20Process%20x4%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22elapsed_s%22%3A%20gil_processes%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22speedup%22%3A%20gil_sequential%20%2F%20gil_processes%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D).round(3)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AF%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E9%80%9F%E3%81%8F%E3%81%AA%E3%82%89%E3%81%9A%E3%80%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A0%E3%81%91%E3%81%8C%E5%8A%B9%E3%81%8F%E3%80%82%E3%81%93%E3%82%8C%E3%81%8C%20GIL%20%E3%81%AE%E5%A7%BF%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%9F%E3%81%A0%E3%81%97%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%204%20%E5%80%8B%E3%81%A7%E3%82%82%204%20%E5%80%8D%E3%81%AB%E3%81%AF%E5%B1%8A%E3%81%8B%E3%81%AA%E3%81%84%E3%80%82%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E7%94%9F%E6%88%90%E8%87%AA%E4%BD%93%E3%81%AB%E3%82%B3%E3%82%B9%E3%83%88%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%80%81%0A%20%20%20%20%E3%81%93%E3%81%AE%E7%82%B9%E3%81%AF%E5%BE%8C%E5%8D%8A%E3%81%AE%E3%80%8Cfork%20%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%80%8D%E3%81%AE%E7%AF%80%E3%81%A7%E5%88%87%E3%82%8A%E5%88%86%E3%81%91%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%23%23%23%20%E4%BE%8B%E5%A4%96%EF%BC%9AGIL%20%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%99%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%0A%0A%20%20%20%20%E3%80%8CCPU%20%E3%83%90%E3%82%A6%E3%83%B3%E3%83%89%E3%81%AA%E3%82%89%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AF%E7%84%A1%E9%A7%84%E3%80%8D%E3%81%AF**%E7%B4%94%20Python%20%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E9%99%90%E3%81%A3%E3%81%9F%E8%A9%B1**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20C%20%E3%81%A7%E6%9B%B8%E3%81%8B%E3%82%8C%E3%81%9F%E6%8B%A1%E5%BC%B5%E3%81%AF%E3%80%81%E8%A8%88%E7%AE%97%E3%81%AB%E5%85%A5%E3%82%8B%E5%89%8D%E3%81%AB%20GIL%20%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%81%AE%E9%96%93%20Python%20%E5%81%B4%E3%81%AF%E5%88%A5%E3%81%AE%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E5%8B%95%E3%81%8B%E3%81%9B%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%A7%E3%82%82%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60hashlib.pbkdf2_hmac%60%EF%BC%88OpenSSL%20%E5%AE%9F%E8%A3%85%EF%BC%89%E3%81%8C%E3%81%9D%E3%81%AE%E4%BE%8B%E3%81%A7%E3%80%81%E9%8D%B5%E5%B0%8E%E5%87%BA%E3%81%AE%E8%A8%88%E7%AE%97%E4%B8%AD%E3%81%AF%20GIL%20%E3%82%92%E6%89%8B%E6%94%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%E3%82%92%20200%2C000%E3%80%9C300%2C000%20%E3%81%A8%E5%A4%89%E3%81%88%E3%81%9F%206%20%E5%80%8B%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E3%80%81%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%E3%81%A8%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E4%B8%A1%E6%96%B9%E3%81%B8%E6%8A%95%E3%81%92%E3%81%A6%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%0A%20%20%20%20**%E3%81%93%E3%81%AE%E9%A1%8C%E6%9D%90%E3%81%AF%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%A7%E3%82%82%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A7%E3%82%82%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82**%0A%20%20%20%20NumPy%E3%83%BBSciPy%E3%83%BBPyTorch%20%E3%81%AE%E9%87%8D%E3%81%84%E6%BC%94%E7%AE%97%E3%82%82%E5%90%8C%E3%81%98%E6%80%A7%E8%B3%AA%E3%82%92%E6%8C%81%E3%81%A4%E3%82%82%E3%81%AE%E3%81%8C%E5%A4%9A%E3%81%84%E3%80%82%0A%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%81%B4%E3%81%A7%E3%81%AF%20%60max_workers%60%20%E3%82%92%201%2C%202%2C%204%2C%208%20%E3%81%A8%E6%8C%AF%E3%82%8B%E3%80%82%E8%AA%AD%E3%81%BF%E6%96%B9%E3%81%AF%202%20%E7%82%B9%E3%80%82%0A%0A%20%20%20%20-%20**%E3%82%BF%E3%82%B9%E3%82%AF%201%20%E5%80%8B%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E6%89%80%E8%A6%81%E6%99%82%E9%96%93%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%94%9F%E6%88%90%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%82%88%E3%82%8A%E5%8D%81%E5%88%86%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82**%0A%20%20%20%20%20%20%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%E3%82%92%201%20%E6%A1%81%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%99%E3%82%8B%E3%81%A8%201%20%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%8C%E6%95%B0%E5%8D%81%20ms%20%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E8%B5%B7%E3%81%93%E3%81%99%E6%99%82%E9%96%93%E3%81%AE%E6%96%B9%E3%81%8C%0A%20%20%20%20%20%20%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%A6%E3%82%82%E9%80%9F%E3%81%8F%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20-%206%20%E5%80%8B%E3%81%97%E3%81%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%8C%E7%84%A1%E3%81%84%E3%81%AE%E3%81%A7%E9%A0%AD%E6%89%93%E3%81%A1%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%828%20%E3%81%BE%E3%81%A7%E5%A2%97%E3%82%84%E3%81%99%E3%81%A8%204%20%E3%81%AE%E3%81%A8%E3%81%8D%E3%82%88%E3%82%8A%E9%81%85%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%208%20%E5%80%8B%E8%B5%B7%E3%81%93%E3%81%99%E3%82%B3%E3%82%B9%E3%83%88%E3%81%8C%E3%80%81%E5%88%86%E5%89%B2%E3%81%A7%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E6%99%82%E9%96%93%E3%82%92%E4%B8%8A%E5%9B%9E%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%20%60ProcessPoolExecutor%60%20%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81worker%20%E3%81%8C%0A%20%20%20%20%60partial(hashlib.pbkdf2_hmac%2C%20...)%60%20%E3%81%A8%E3%81%84%E3%81%86%20C%20%E9%96%A2%E6%95%B0%E3%81%AE%20partial%20%E3%81%A7%20pickle%20%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%60fork%60%20%E3%82%92%E9%81%B8%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E7%90%86%E7%94%B1%E3%81%AF%20pickle%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F**%E8%B5%B7%E5%8B%95%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E4%BD%8E%E3%81%95**%E3%81%A7%E3%80%81%60spawn%60%20%E3%81%A7%E3%82%82%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%E4%BB%95%E4%BA%8B%E3%82%92%E3%81%97%E3%81%AA%E3%81%84%E7%A9%BA%E3%81%AE%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%BB%E7%B5%82%E4%BA%86%E6%99%82%E9%96%93%E3%82%82%E6%B8%AC%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%80%82%0A%20%20%20%20**%E3%81%93%E3%81%93%E3%81%AF%E3%81%BE%E3%81%A0%20GPU%20%E3%81%AB%E4%B8%80%E5%BA%A6%E3%82%82%E8%A7%A6%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82**%0A%20%20%20%20%E5%BE%8C%E5%8D%8A%E3%81%AE%E3%80%8Cfork%20%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%80%8D%E3%81%AE%E7%AF%80%E3%81%A7%E3%80%81GPU%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%BE%8C%E3%81%AE%E5%90%8C%E3%81%98%E8%A8%88%E6%B8%AC%E3%81%A8%E7%AA%81%E3%81%8D%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cf%2C%20get_context%2C%20hashlib%2C%20os%2C%20partial%2C%20pd%2C%20time)%3A%0A%20%20%20%20cpu_tasks%20%3D%20%5B200_000%2C%20220_000%2C%20240_000%2C%20260_000%2C%20280_000%2C%20300_000%5D%0A%20%20%20%20digest_worker%20%3D%20partial(hashlib.pbkdf2_hmac%2C%20%22sha256%22%2C%20b%22marimo%22%2C%20b%22parallel%22%2C%20dklen%3D32)%0A%0A%20%20%20%20_start%20%3D%20time.perf_counter()%0A%20%20%20%20%5Bdigest_worker(task)%20for%20task%20in%20cpu_tasks%5D%0A%20%20%20%20digest_sequential%20%3D%20time.perf_counter()%20-%20_start%0A%0A%20%20%20%20_start%20%3D%20time.perf_counter()%0A%20%20%20%20with%20cf.ThreadPoolExecutor(max_workers%3D6)%20as%20_thread_pool%3A%0A%20%20%20%20%20%20%20%20list(_thread_pool.map(digest_worker%2C%20cpu_tasks))%0A%20%20%20%20digest_threads%20%3D%20time.perf_counter()%20-%20_start%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22pbkdf2%3A%20sequential%20%7Bdigest_sequential%20*%201e3%3A.0f%7D%20ms%22%0A%20%20%20%20%20%20%20%20f%22%20%2F%20threads(6)%20%7Bdigest_threads%20*%201e3%3A.0f%7D%20ms%22%0A%20%20%20%20%20%20%20%20f%22%20-%3E%20%7Bdigest_sequential%20%2F%20digest_threads%3A.2f%7Dx%20(GIL%20%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E8%A8%BC%E6%8B%A0)%22%0A%20%20%20%20)%0A%0A%20%20%20%20worker_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_process_workers%20in%20%5B1%2C%202%2C%204%2C%208%5D%3A%0A%20%20%20%20%20%20%20%20_start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20with%20cf.ProcessPoolExecutor(%0A%20%20%20%20%20%20%20%20%20%20%20%20max_workers%3D_process_workers%2C%20mp_context%3Dget_context(%22fork%22)%0A%20%20%20%20%20%20%20%20)%20as%20_process_executor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20list(_process_executor.map(digest_worker%2C%20cpu_tasks))%0A%20%20%20%20%20%20%20%20worker_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22max_workers%22%3A%20_process_workers%2C%20%22elapsed_s%22%3A%20time.perf_counter()%20-%20_start%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20print(f%22CPU%20count%20is%20%7Bos.cpu_count()%7D%2C%20tasks%20%3D%20%7Blen(cpu_tasks)%7D%22)%0A%0A%20%20%20%20def%20empty_pool_seconds(max_workers%3D8)%3A%0A%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20with%20cf.ProcessPoolExecutor(%0A%20%20%20%20%20%20%20%20%20%20%20%20max_workers%3Dmax_workers%2C%20mp_context%3Dget_context(%22fork%22)%0A%20%20%20%20%20%20%20%20)%20as%20executor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20list(executor.map(int%2C%20range(max_workers)))%0A%20%20%20%20%20%20%20%20return%20time.perf_counter()%20-%20start%0A%0A%20%20%20%20fork_cost_before_cuda%20%3D%20empty_pool_seconds()%0A%20%20%20%20print(f%22empty%20pool%20of%208%20workers%3A%20%7Bfork_cost_before_cuda%20*%201e3%3A.0f%7D%20ms%22)%0A%20%20%20%20_frame%20%3D%20pd.DataFrame(worker_rows)%0A%20%20%20%20_frame%5B%22speedup_vs_sequential%22%5D%20%3D%20digest_sequential%20%2F%20_frame%5B%22elapsed_s%22%5D%0A%20%20%20%20_frame%0A%20%20%20%20return%20empty_pool_seconds%2C%20fork_cost_before_cuda%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B8%A1%E3%81%99%0A%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AF%E3%83%A1%E3%83%A2%E3%83%AA%E7%A9%BA%E9%96%93%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E7%B5%90%E6%9E%9C%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B%E3%81%AB%E3%81%AF%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AA%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8C%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E4%BB%A3%E8%A1%A8%E7%9A%84%E3%81%AA%202%20%E3%81%A4%E3%82%92%E7%A4%BA%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20**%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AA**%20(%60Value%60%20%2F%20%60Array%60)%3A%20%E5%9B%BA%E5%AE%9A%E9%95%B7%E3%81%AE%E5%80%A4%E3%83%BB%E9%85%8D%E5%88%97%E3%82%92%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AA%E4%B8%8A%E3%81%AB%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%60lock%3DFalse%60%20%E3%81%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E4%BB%98%E3%81%91%E3%81%AA%E3%81%84%E6%8C%87%E5%AE%9A%E3%81%A7%E3%80%81%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%8C%E7%AB%B6%E5%90%88%E3%81%97%E3%81%AA%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AB%E9%99%90%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E5%AD%90%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8C%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C%E3%82%92%E8%A6%AA%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%AA%AD%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**%E3%83%91%E3%82%A4%E3%83%97**%20(%60Pipe%60)%3A%20%E7%89%87%E6%96%B9%E5%90%91%EF%BC%88%60duplex%3DFalse%60%EF%BC%89%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%0A%20%20%20%20%20%20%E5%AD%90%E3%81%8C%20%60send%60%20%E3%81%97%E3%81%9F%20Python%20%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A6%AA%E3%81%8C%20%60recv%60%20%E3%81%A7%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20pickle%20%E7%B5%8C%E7%94%B1%E3%81%AA%E3%81%AE%E3%81%A7%E4%BB%BB%E6%84%8F%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%B8%A1%E3%81%9B%E3%82%8B%E3%81%8C%E3%80%81%E3%81%9D%E3%81%AE%E5%88%86%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%83%91%E3%82%A4%E3%83%97%E3%81%A7%E3%81%AF**%E8%A6%AA%E5%81%B4%E3%81%8C%E9%80%81%E4%BF%A1%E7%AB%AF%E3%82%92%E9%96%89%E3%81%98%E3%82%8B**%E3%81%93%E3%81%A8%E3%81%8C%E9%87%8D%E8%A6%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E9%96%89%E3%81%98%E5%BF%98%E3%82%8C%E3%82%8B%E3%81%A8%0A%20%20%20%20%E9%80%81%E4%BF%A1%E7%AB%AF%E3%81%8C%E9%96%8B%E3%81%84%E3%81%9F%E3%81%BE%E3%81%BE%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E5%8F%97%E4%BF%A1%E5%81%B4%E3%81%8C%E7%B5%82%E7%AB%AF%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(get_context%2C%20pd)%3A%0A%20%20%20%20fork_context%20%3D%20get_context(%22fork%22)%0A%0A%20%20%20%20def%20shared_memory_target(number%2C%20array)%3A%0A%20%20%20%20%20%20%20%20number.value%20%3D%203.1415927%0A%20%20%20%20%20%20%20%20for%20index%20in%20range(len(array))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20array%5Bindex%5D%20%3D%20-array%5Bindex%5D%0A%0A%20%20%20%20shared_number%20%3D%20fork_context.Value(%22d%22%2C%200.0%2C%20lock%3DFalse)%0A%20%20%20%20shared_array%20%3D%20fork_context.Array(%22i%22%2C%20range(10)%2C%20lock%3DFalse)%0A%20%20%20%20_process%20%3D%20fork_context.Process(target%3Dshared_memory_target%2C%20args%3D(shared_number%2C%20shared_array))%0A%20%20%20%20_process.start()%0A%20%20%20%20_process.join()%0A%20%20%20%20_process.close()%0A%20%20%20%20pd.DataFrame(%5B%0A%20%20%20%20%20%20%20%20%7B%22shared_number%22%3A%20shared_number.value%2C%20%22shared_array%22%3A%20list(shared_array)%7D%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(fork_context%2C)%0A%0A%0A%40app.cell%0Adef%20_(fork_context%2C%20pd)%3A%0A%20%20%20%20def%20pipe_target(index%2C%20send_end)%3A%0A%20%20%20%20%20%20%20%20send_end.send(%7B%22index%22%3A%20index%2C%20%22negated%22%3A%20-index%7D)%0A%20%20%20%20%20%20%20%20send_end.close()%0A%0A%20%20%20%20_endpoints%20%3D%20%5B%5D%0A%20%20%20%20_processes%20%3D%20%5B%5D%0A%20%20%20%20for%20_pipe_index%20in%20range(4)%3A%0A%20%20%20%20%20%20%20%20_recv_end%2C%20_send_end%20%3D%20fork_context.Pipe(duplex%3DFalse)%0A%20%20%20%20%20%20%20%20_pipe_process%20%3D%20fork_context.Process(target%3Dpipe_target%2C%20args%3D(_pipe_index%2C%20_send_end))%0A%20%20%20%20%20%20%20%20_pipe_process.start()%0A%20%20%20%20%20%20%20%20_send_end.close()%20%20%23%20%E8%A6%AA%E5%81%B4%E3%81%AE%E9%80%81%E4%BF%A1%E7%AB%AF%E3%81%AF%E9%96%89%E3%81%98%E3%82%8B%0A%20%20%20%20%20%20%20%20_endpoints.append(_recv_end)%0A%20%20%20%20%20%20%20%20_processes.append(_pipe_process)%0A%20%20%20%20pipe_messages%20%3D%20%5B_recv_end.recv()%20for%20_recv_end%20in%20_endpoints%5D%0A%20%20%20%20for%20_recv_end%20in%20_endpoints%3A%0A%20%20%20%20%20%20%20%20_recv_end.close()%0A%20%20%20%20for%20_pipe_process%20in%20_processes%3A%0A%20%20%20%20%20%20%20%20_pipe_process.join()%0A%20%20%20%20%20%20%20%20_pipe_process.close()%0A%20%20%20%20pd.DataFrame(pipe_messages)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%EF%BC%9AI%2FO%20%E3%83%90%E3%82%A6%E3%83%B3%E3%83%89%E3%81%AA%E4%BB%95%E4%BA%8B%0A%0A%20%20%20%20I%2FO%20%E5%BE%85%E3%81%A1%E3%81%AE%E9%96%93%E3%81%AF%20GIL%20%E3%81%8C%E8%A7%A3%E6%94%BE%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E3%81%93%E3%81%A1%E3%82%89%E3%81%AF%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%A7%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%A4%96%E9%83%A8%E3%82%B5%E3%82%A4%E3%83%88%E3%81%B8%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%80%81%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E5%86%85%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%20HTTP%20%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E7%AB%8B%E3%81%A6%E3%80%81%0A%20%20%20%20%E3%81%9D%E3%81%93%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%9F%206%20%E5%80%8B%E3%81%AE%20JSON%20%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%82%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%BE%E3%81%A7%E3%82%92%E8%A1%8C%E3%81%86%E3%80%82%0A%20%20%20%20%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AF%200%20%E7%95%AA%E3%82%92%20bind%20%E3%81%97%E3%81%A6%20OS%20%E3%81%AB%E7%A9%BA%E3%81%8D%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E9%81%B8%E3%81%B0%E3%81%9B%E3%80%81%0A%20%20%20%20%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E3%81%AF%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%AD%E3%82%B0%E3%82%92%E6%8A%91%E6%AD%A2%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%B5%82%E4%BA%86%E6%99%82%E3%81%AB%E7%A2%BA%E5%AE%9F%E3%81%AB%E8%90%BD%E3%81%A8%E3%81%99%E3%81%9F%E3%82%81%0A%20%20%20%20%60atexit%60%20%E3%81%AB%E3%82%82%E5%BE%8C%E5%A7%8B%E6%9C%AB%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E3%81%AB%E3%81%AF%20**50%20ms%20%E3%81%AE%E4%BA%BA%E7%82%BA%E7%9A%84%E3%81%AA%E5%BE%85%E3%81%A1**%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%82%E3%82%8B%E3%80%82%E5%90%8C%E4%B8%80%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E9%85%8D%E4%BF%A1%E3%81%AF%0A%20%20%20%20%E5%BF%9C%E7%AD%94%E3%81%8C%E9%80%9F%E3%81%99%E3%81%8E%E3%81%A6%201%20%E4%BB%B6%E3%81%82%E3%81%9F%E3%82%8A%E6%95%B0%20ms%20%E3%81%97%E3%81%8B%E3%81%8B%E3%81%8B%E3%82%89%E3%81%9A%E3%80%81%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A7%E3%81%AF%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E6%96%B9%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%B6%8A%E3%81%97%E3%81%AE%20API%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A7%E3%81%AF%E3%81%93%E3%81%AE%E7%A8%8B%E5%BA%A6%E3%81%AE%E5%BE%85%E3%81%A1%E3%81%8C%E6%99%AE%E9%80%9A%E3%81%AB%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20SimpleHTTPRequestHandler%2C%0A%20%20%20%20Thread%2C%0A%20%20%20%20ThreadingHTTPServer%2C%0A%20%20%20%20atexit%2C%0A%20%20%20%20data_dir%2C%0A%20%20%20%20json%2C%0A%20%20%20%20np%2C%0A%20%20%20%20partial%2C%0A%20%20%20%20requests%2C%0A%20%20%20%20socket%2C%0A%20%20%20%20time%2C%0A)%3A%0A%20%20%20%20RESPONSE_DELAY_S%20%3D%200.05%0A%20%20%20%20http_dir%20%3D%20data_dir%20%2F%20%22http_payloads%22%0A%20%20%20%20http_dir.mkdir(exist_ok%3DTrue)%0A%20%20%20%20rng_payload%20%3D%20np.random.default_rng(42)%0A%20%20%20%20for%20_index%20in%20range(6)%3A%0A%20%20%20%20%20%20%20%20_payload%20%3D%20%7B%22id%22%3A%20_index%2C%20%22values%22%3A%20rng_payload.normal(size%3D8).round(4).tolist()%7D%0A%20%20%20%20%20%20%20%20(http_dir%20%2F%20f%22payload_%7B_index%7D.json%22).write_text(json.dumps(_payload)%2C%20encoding%3D%22utf-8%22)%0A%0A%20%20%20%20class%20QuietHandler(SimpleHTTPRequestHandler)%3A%0A%20%20%20%20%20%20%20%20def%20log_message(self%2C%20format%2C%20*args)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20%20%20%20%20def%20do_GET(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%AE%9F%E5%9C%A8%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E4%B8%A6%E3%81%BF%E3%81%AE%E5%BE%85%E3%81%A1%E3%82%92%E6%A8%A1%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%8C%E7%84%A1%E3%81%84%E3%81%A8%E5%BF%9C%E7%AD%94%E3%81%8C%E9%80%9F%E3%81%99%E3%81%8E%E3%81%A6%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%82%88%E3%82%8A%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E6%96%B9%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%AA%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(RESPONSE_DELAY_S)%0A%20%20%20%20%20%20%20%20%20%20%20%20super().do_GET()%0A%0A%20%20%20%20with%20socket.socket()%20as%20_sock%3A%0A%20%20%20%20%20%20%20%20_sock.bind((%22127.0.0.1%22%2C%200))%0A%20%20%20%20%20%20%20%20port%20%3D%20_sock.getsockname()%5B1%5D%0A%20%20%20%20http_server%20%3D%20ThreadingHTTPServer(%0A%20%20%20%20%20%20%20%20(%22127.0.0.1%22%2C%20port)%2C%20partial(QuietHandler%2C%20directory%3Dstr(http_dir))%0A%20%20%20%20)%0A%20%20%20%20server_thread%20%3D%20Thread(target%3Dhttp_server.serve_forever%2C%20daemon%3DTrue)%0A%20%20%20%20server_thread.start()%0A%20%20%20%20thread_urls%20%3D%20%5Bf%22http%3A%2F%2F127.0.0.1%3A%7Bport%7D%2Fpayload_%7Bindex%7D.json%22%20for%20index%20in%20range(6)%5D%0A%20%20%20%20requests.get(thread_urls%5B0%5D%2C%20timeout%3D5).raise_for_status()%0A%0A%20%20%20%20server_state%20%3D%20%7B%22closed%22%3A%20False%7D%0A%0A%20%20%20%20def%20cleanup_server()%3A%0A%20%20%20%20%20%20%20%20if%20server_state%5B%22closed%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20http_server.shutdown()%0A%20%20%20%20%20%20%20%20http_server.server_close()%0A%20%20%20%20%20%20%20%20server_thread.join(timeout%3D1)%0A%20%20%20%20%20%20%20%20server_state%5B%22closed%22%5D%20%3D%20True%0A%0A%20%20%20%20atexit.register(cleanup_server)%0A%20%20%20%20print(f%22serving%20%7Blen(thread_urls)%7D%20payloads%20on%20127.0.0.1%3A%7Bport%7D%20%22%0A%20%20%20%20%20%20%20%20%20%20f%22with%20%7BRESPONSE_DELAY_S%20*%201e3%3A.0f%7D%20ms%20artificial%20delay%22)%0A%20%20%20%20return%20cleanup_server%2C%20thread_urls%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%60max_workers%60%20%E3%82%92%201%2C%202%2C%204%2C%208%20%E3%81%A8%E5%A4%89%E3%81%88%E3%81%A6%206%20%E4%BB%B6%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%AB%E3%81%8B%E3%81%8B%E3%82%8B%E6%99%82%E9%96%93%E3%82%92%E6%B8%AC%E3%82%8B%E3%80%82%0A%0A%20%20%20%201%20%E4%BB%B6%E3%81%82%E3%81%9F%E3%82%8A%2050%20ms%20%E3%81%AE%E5%BE%85%E3%81%A1%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E9%80%90%E6%AC%A1%E3%81%AA%E3%82%89%E7%B4%84%20300%20ms%20%E3%81%8B%E3%81%8B%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E3%81%A8%E5%BE%85%E3%81%A1%E6%99%82%E9%96%93%E3%81%8C%E9%87%8D%E3%81%AA%E3%82%8A%E3%80%81%E3%80%8C6%20%E4%BB%B6%E3%82%92%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC%E6%95%B0%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E5%88%87%E3%82%8A%E4%B8%8A%E3%81%92%E5%9B%9E%E6%95%B0%E3%80%8D%C3%9750%20ms%20%E3%81%B8%0A%20%20%20%20%E8%BF%91%E3%81%A5%E3%81%8F%E3%80%82%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC%E3%81%8C%206%20%E3%82%92%E8%B6%85%E3%81%88%E3%81%A6%E3%82%82%E3%80%81%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%8C%206%20%E5%80%8B%E3%81%97%E3%81%8B%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E6%94%B9%E5%96%84%E3%81%AF%E6%AD%A2%E3%81%BE%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E7%B4%94%20Python%20%E3%81%AE%20CPU%20%E8%A8%88%E7%AE%97%E3%81%A7%E3%81%AF%E5%8A%B9%E3%81%8B%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%8C%20I%2FO%20%E3%81%A7%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%8A%B9%E3%81%8F%E3%81%AE%E3%81%AF%E3%80%81%0A%20%20%20%20%60requests%60%20%E3%81%8C%E5%BF%9C%E7%AD%94%E3%82%92%E5%BE%85%E3%81%A4%E9%96%93%20GIL%20%E3%82%92%E6%89%8B%E6%94%BE%E3%81%99%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cf%2C%20pd%2C%20requests%2C%20thread_urls%2C%20timed_call)%3A%0A%20%20%20%20def%20fetch_status(url%3A%20str)%3A%0A%20%20%20%20%20%20%20%20response%20%3D%20requests.get(url%2C%20timeout%3D5)%0A%20%20%20%20%20%20%20%20response.raise_for_status()%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22url%22%3A%20url.rsplit(%22%2F%22%2C%201)%5B-1%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22status_code%22%3A%20response.status_code%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22bytes%22%3A%20len(response.content)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20def%20fetch_all(urls%2C%20max_workers%3A%20int)%3A%0A%20%20%20%20%20%20%20%20with%20cf.ThreadPoolExecutor(max_workers%3Dmax_workers)%20as%20_thread_executor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20list(_thread_executor.map(fetch_status%2C%20urls))%0A%0A%20%20%20%20timing_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_thread_workers%20in%20%5B1%2C%202%2C%204%2C%208%5D%3A%0A%20%20%20%20%20%20%20%20_statuses%2C%20_elapsed%20%3D%20timed_call(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22thread%20pool%20max_workers%3D%7B_thread_workers%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fetch_all%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20thread_urls%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_thread_workers%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20timing_rows.append(%7B%22max_workers%22%3A%20_thread_workers%2C%20%22elapsed_s%22%3A%20_elapsed%7D)%0A%20%20%20%20_frame%20%3D%20pd.DataFrame(timing_rows)%0A%20%20%20%20_frame%5B%22speedup_vs_1%22%5D%20%3D%20_frame%5B%22elapsed_s%22%5D.iloc%5B0%5D%20%2F%20_frame%5B%22elapsed_s%22%5D%0A%20%20%20%20_frame%0A%20%20%20%20return%20(fetch_status%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20asyncio%EF%BC%9A%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%20I%2FO%20%E4%B8%A6%E5%88%97%0A%0A%20%20%20%20I%2FO%20%E4%B8%A6%E5%88%97%E3%81%AB%E3%81%AF%E3%82%82%E3%81%86%201%20%E3%81%A4%E4%B8%BB%E8%A6%81%E3%81%AA%E9%81%B8%E6%8A%9E%E8%82%A2%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82asyncio%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E3%80%81**1%20%E6%9C%AC%E3%81%AE%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AE%E4%B8%8A%E3%81%A7%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%8C%0A%20%20%20%20%E5%BE%85%E3%81%A1%E7%8A%B6%E6%85%8B%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B**%E3%80%82OS%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E4%BD%9C%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%90%8C%E6%99%82%E6%8E%A5%E7%B6%9A%E6%95%B0%E3%81%8C%E6%95%B0%E5%8D%83%E8%A6%8F%E6%A8%A1%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%82%E7%A0%B4%E7%B6%BB%E3%81%97%E3%81%AB%E3%81%8F%E3%81%84%E3%80%82%0A%0A%20%20%20%20%E6%AF%94%E8%BC%83%E3%82%92%E5%85%AC%E5%B9%B3%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E4%B8%A1%E6%96%B9%E3%81%A8%E3%82%82%20%60httpx%60%20%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%60httpx%60%20%E3%81%AF%E5%90%8C%E6%9C%9F%20API%20%E3%81%A8%E9%9D%9E%E5%90%8C%E6%9C%9F%20API%20%E3%81%8C%E3%81%BB%E3%81%BC%E5%90%8C%E3%81%98%E5%BD%A2%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%B7%AE%E3%81%8C%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A0%E3%81%91%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%E5%90%8C%E6%9C%9F%20%2B%20%60ThreadPoolExecutor%60%3A%20%60httpx.Client%60%20%E3%82%92%208%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%A7%E4%BD%BF%E3%81%86%0A%20%20%20%20-%20%E9%9D%9E%E5%90%8C%E6%9C%9F%20%2B%20%60asyncio.gather%60%3A%20%60httpx.AsyncClient%60%20%E3%81%A7%206%20%E4%BB%B6%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E6%8A%95%E3%81%92%E3%82%8B%0A%0A%20%20%20%20marimo%20%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%20%60await%60%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%9B%B8%E3%81%91%E3%82%8B%EF%BC%88%E3%82%BB%E3%83%AB%E3%81%8C%20%60async%20def%60%20%E3%81%AB%E3%81%AA%E3%82%8B%EF%BC%89%E3%80%82%0A%20%20%20%20%E9%80%86%E3%81%AB%20%60asyncio.run()%60%20%E3%81%AF%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%80%82marimo%20%E8%87%AA%E8%BA%AB%E3%81%8C%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%B8%AD%E3%81%A7%0A%20%20%20%20%E3%82%BB%E3%83%AB%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%60asyncio.run()%20cannot%20be%20called%20from%20a%20running%20event%20loop%60%0A%20%20%20%20%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E5%90%8C%E3%81%98%E7%90%86%E7%94%B1%E3%81%A7%20Jupyter%20%E3%81%A7%E3%82%82%20%60asyncio.run()%60%20%E3%81%AF%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Aasync%20def%20_(asyncio%2C%20cf%2C%20httpx%2C%20pd%2C%20thread_urls%2C%20time)%3A%0A%20%20%20%20def%20httpx_sync_fetch(client%2C%20url)%3A%0A%20%20%20%20%20%20%20%20response%20%3D%20client.get(url)%0A%20%20%20%20%20%20%20%20response.raise_for_status()%0A%20%20%20%20%20%20%20%20return%20len(response.content)%0A%0A%20%20%20%20async%20def%20httpx_async_fetch(client%2C%20url)%3A%0A%20%20%20%20%20%20%20%20response%20%3D%20await%20client.get(url)%0A%20%20%20%20%20%20%20%20response.raise_for_status()%0A%20%20%20%20%20%20%20%20return%20len(response.content)%0A%0A%20%20%20%20def%20fetch_with_threads()%3A%0A%20%20%20%20%20%20%20%20with%20httpx.Client(timeout%3D5.0)%20as%20client%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20cf.ThreadPoolExecutor(max_workers%3D8)%20as%20executor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20list(executor.map(lambda%20url%3A%20httpx_sync_fetch(client%2C%20url)%2C%20thread_urls))%0A%0A%20%20%20%20async%20def%20fetch_with_asyncio()%3A%0A%20%20%20%20%20%20%20%20async%20with%20httpx.AsyncClient(timeout%3D5.0)%20as%20client%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20await%20asyncio.gather(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20*%5Bhttpx_async_fetch(client%2C%20url)%20for%20url%20in%20thread_urls%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20measure_sync(func%2C%20repeats%3D3)%3A%0A%20%20%20%20%20%20%20%20func()%20%20%23%20%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%0A%20%20%20%20%20%20%20%20samples%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(repeats)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20func()%0A%20%20%20%20%20%20%20%20%20%20%20%20samples.append(time.perf_counter()%20-%20start)%0A%20%20%20%20%20%20%20%20return%20min(samples)%0A%0A%20%20%20%20async%20def%20measure_async(func%2C%20repeats%3D3)%3A%0A%20%20%20%20%20%20%20%20await%20func()%20%20%23%20%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%0A%20%20%20%20%20%20%20%20samples%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(repeats)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20func()%0A%20%20%20%20%20%20%20%20%20%20%20%20samples.append(time.perf_counter()%20-%20start)%0A%20%20%20%20%20%20%20%20return%20min(samples)%0A%0A%20%20%20%20sync_elapsed%20%3D%20measure_sync(fetch_with_threads)%0A%20%20%20%20async_elapsed%20%3D%20await%20measure_async(fetch_with_asyncio)%0A%20%20%20%20_sync_sizes%20%3D%20fetch_with_threads()%0A%20%20%20%20_async_sizes%20%3D%20await%20fetch_with_asyncio()%0A%0A%20%20%20%20io_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%22strategy%22%3A%20%22httpx%20sync%20%2B%20ThreadPoolExecutor(8)%22%2C%20%22elapsed_s%22%3A%20sync_elapsed%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22strategy%22%3A%20%22httpx%20async%20%2B%20asyncio.gather%22%2C%20%22elapsed_s%22%3A%20async_elapsed%7D%2C%0A%20%20%20%20%5D%0A%20%20%20%20print(f%22bytes%20match%3A%20%7Blist(_sync_sizes)%20%3D%3D%20list(_async_sizes)%7D%22)%0A%20%20%20%20_frame%20%3D%20pd.DataFrame(io_rows)%0A%20%20%20%20_frame%5B%22speedup_vs_threads%22%5D%20%3D%20sync_elapsed%20%2F%20_frame%5B%22elapsed_s%22%5D%0A%20%20%20%20_frame%0A%20%20%20%20return%20(io_rows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%206%20%E4%BB%B6%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E6%8A%95%E3%81%92%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E9%80%90%E6%AC%A1%E3%81%AA%E3%82%89%20300%20ms%20%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E4%B8%8B%E3%81%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%9F%E3%81%A0%E3%81%97%201%20%E4%BB%B6%E3%81%B6%E3%82%93%E3%81%AE%E5%BE%85%E3%81%A1%EF%BC%8850%20ms%EF%BC%89%E3%81%A1%E3%82%87%E3%81%86%E3%81%A9%E3%81%AB%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E7%94%9F%E6%88%90%E3%80%81%E6%8E%A5%E7%B6%9A%E3%81%AE%E7%A2%BA%E7%AB%8B%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%E3%82%84%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%8C%0A%20%20%20%20%E4%B8%8A%E4%B9%97%E3%81%9B%E3%81%95%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20**%E3%81%93%E3%81%AE%E8%A6%8F%E6%A8%A1%E3%81%A7%E3%81%AF%E4%B8%A1%E8%80%85%E3%81%AB%E5%A4%A7%E3%81%8D%E3%81%AA%E5%B7%AE%E3%81%AF%E5%87%BA%E3%81%AA%E3%81%84%E3%80%82**%20%E3%82%80%E3%81%97%E3%82%8D%20asyncio%20%E3%81%AE%E3%81%BB%E3%81%86%E3%81%8C%E3%82%8F%E3%81%9A%E3%81%8B%E3%81%AB%E9%81%85%E3%81%8F%E5%87%BA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E7%94%9F%E6%88%90%E3%81%A8%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%A8%E3%81%84%E3%81%86%E5%9B%BA%E5%AE%9A%E8%B2%BB%E3%81%8C%E3%80%81%0A%20%20%20%206%20%E4%BB%B6%E3%81%B6%E3%82%93%E3%81%AE%E7%AF%80%E7%B4%84%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%86%E3%82%8B%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20asyncio%20%E3%81%8C%E5%8A%B9%E3%81%84%E3%81%A6%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81%E5%90%8C%E6%99%82%E6%8E%A5%E7%B6%9A%E3%81%8C%E6%95%B0%E7%99%BE%E3%80%9C%E6%95%B0%E5%8D%83%E3%81%AB%E5%A2%97%E3%81%88%E3%81%A6%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AE%E7%94%9F%E6%88%90%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%8C%E7%84%A1%E8%A6%96%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E9%81%B8%E6%8A%9E%E3%81%AE%E5%9F%BA%E6%BA%96%E3%81%AF%E9%80%9F%E5%BA%A6%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%BD%A2%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20asyncio%20%E3%81%AF%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%81%B4%E3%81%BE%E3%81%A7%20%60async%60%20%E3%81%AB%E6%9F%93%E3%81%BE%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E6%97%A2%E5%AD%98%E3%81%AE%E5%90%8C%E6%9C%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%B8%E5%BE%8C%E3%81%8B%E3%82%89%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E9%9B%A3%E3%81%97%E3%81%84%E3%80%82%0A%20%20%20%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AF%E6%97%A2%E5%AD%98%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%B8%A1%E3%81%9B%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%203%20%E5%9B%9E%E6%B8%AC%E3%82%8A%E3%80%81%E6%9C%80%E5%B0%8F%E5%80%A4%E3%82%92%E6%8E%A1%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%201%20%E5%9B%9E%E3%81%A0%E3%81%91%E6%B8%AC%E3%82%8B%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E7%94%9F%E6%88%90%E3%82%84%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%8C%E4%B9%97%E3%82%8A%E3%80%81%0A%20%20%20%20%E5%85%88%E3%81%AB%E6%B8%AC%E3%81%A3%E3%81%9F%E3%81%BB%E3%81%86%E3%81%8C%E4%B8%8D%E5%88%A9%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60tqdm.contrib.concurrent.thread_map%60%20%E3%81%AF%20%60ThreadPoolExecutor%60%20%E3%81%A8%E9%80%B2%E6%8D%97%E3%83%90%E3%83%BC%E3%82%92%0A%20%20%20%20%E3%81%B2%E3%81%A8%E3%81%BE%E3%81%A8%E3%82%81%E3%81%AB%E3%81%97%E3%81%9F%E8%96%84%E3%81%84%E3%83%A9%E3%83%83%E3%83%91%E3%81%A7%E3%80%81%60map%60%20%E3%81%A8%E5%90%8C%E3%81%98%E6%84%9F%E8%A6%9A%E3%81%A7%E6%9B%B8%E3%81%91%E3%82%8B%E3%80%82%0A%20%20%20%20%E9%9D%99%E7%9A%84%20HTML%20%E3%81%AB%E3%81%AF%E9%80%B2%E6%8D%97%E3%83%90%E3%83%BC%E3%81%8C%E6%AE%8B%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%9F%E3%82%81%20%60disable%3DTrue%60%20%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E5%8F%96%E5%BE%97%E7%B5%90%E6%9E%9C%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%80%81%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%20HTTP%20%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cleanup_server%2C%20fetch_status%2C%20io_rows%2C%20pd%2C%20thread_map%2C%20thread_urls)%3A%0A%20%20%20%20_%20%3D%20io_rows%20%20%23%20asyncio%20%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%8C%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%8B%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E6%AD%A2%E3%82%81%E3%82%8B%0A%20%20%20%20thread_map_rows%20%3D%20thread_map(fetch_status%2C%20thread_urls%2C%20max_workers%3D8%2C%20disable%3DTrue)%0A%20%20%20%20cleanup_server()%0A%20%20%20%20pd.DataFrame(thread_map_rows)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20GPU%20%E3%81%AB%E3%82%88%E3%82%8B%E9%AB%98%E9%80%9F%E5%8C%96%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AF%204%20%E6%AE%B5%E6%A7%8B%E3%81%88%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%201.%20**%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8F%206%20%E3%81%A4%E3%81%AE%E6%96%B9%E6%B3%95**%20%E2%80%94%20%E5%90%8C%E3%81%98%E8%A8%88%E7%AE%97%E3%82%92%206%20%E9%80%9A%E3%82%8A%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%A6%E6%AF%94%E3%81%B9%E3%82%8B%0A%20%20%20%202.%20**%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%9E%8D%E5%90%88**%20%E2%80%94%20%E8%A4%87%E6%95%B0%E3%81%AE%E6%BC%94%E7%AE%97%E3%82%92%201%20%E3%81%A4%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%0A%20%20%20%203.%20**%E6%BC%94%E7%AE%97%E5%BE%8B%E9%80%9F%E3%81%AE%E4%BB%95%E4%BA%8B**%20%E2%80%94%20%E8%A1%8C%E5%88%97%E7%A9%8D%E3%81%A7%E3%80%81GPU%20%E3%81%8C%E6%9C%AC%E5%BD%93%E3%81%AB%E5%8A%B9%E3%81%8F%E6%9D%A1%E4%BB%B6%E3%82%92%E8%A6%8B%E3%82%8B%0A%20%20%20%204.%20**%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%AE%E6%8C%87%E9%87%9D**%20%E2%80%94%20%E4%BB%A5%E4%B8%8A%E3%81%AE%E5%AE%9F%E6%B8%AC%E3%81%8B%E3%82%89%E3%80%81%E3%81%A9%E3%82%8C%E3%82%92%E3%81%84%E3%81%A4%E4%BD%BF%E3%81%86%E3%81%8B%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%0A%0A%20%20%20%20%23%23%23%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8F%206%20%E3%81%A4%E3%81%AE%E6%96%B9%E6%B3%95%0A%0A%20%20%20%20%E3%81%BE%E3%81%9A%E3%80%81%E3%82%82%E3%81%A3%E3%81%A8%E3%82%82%E5%8D%98%E7%B4%94%E3%81%AA%E8%A6%81%E7%B4%A0%E3%81%94%E3%81%A8%E3%81%AE%E5%8A%A0%E7%AE%97%20%60c%5Bi%5D%20%3D%20a%5Bi%5D%20%2B%20b%5Bi%5D%60%20%E3%82%92%E9%A1%8C%E6%9D%90%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%A6%81%E7%B4%A0%E6%95%B0%E3%81%AF%20%242%5E%7B24%7D%24%EF%BC%88float32%20%E3%81%A7%201%20%E9%85%8D%E5%88%97%E3%81%82%E3%81%9F%E3%82%8A%2064%20MiB%EF%BC%89%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AF%201%20%E8%A6%81%E7%B4%A0%E3%81%82%E3%81%9F%E3%82%8A%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%BC%94%E7%AE%97%201%20%E5%9B%9E%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%2012%20%E3%83%90%E3%82%A4%E3%83%88%E3%81%AE%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E5%AE%8C%E5%85%A8%E3%81%AB**%E3%83%A1%E3%83%A2%E3%83%AA%E5%B8%AF%E5%9F%9F%E5%BE%8B%E9%80%9F**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%E3%80%81%E3%81%A9%E3%81%AE%E6%96%B9%E5%BC%8F%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%A6%E3%82%82%0A%20%20%20%20%E6%AD%A3%E3%81%97%E3%81%8F%E6%9B%B8%E3%81%91%E3%81%A6%E3%81%84%E3%82%8B%E9%99%90%E3%82%8A%E9%80%9F%E5%BA%A6%E3%81%AF%E3%81%BB%E3%81%BC%E5%90%8C%E3%81%98%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AF%E3%81%9A%E3%81%A7%E3%80%81%0A%20%20%20%20%E3%81%9D%E3%82%8C%E3%81%8C%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%8C%E6%AF%94%E8%BC%83%E3%81%AE%E7%9B%AE%E7%9A%84%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E6%AC%A1%E3%81%AE%206%20%E6%96%B9%E5%BC%8F%E3%80%82%0A%0A%20%20%20%20%7C%20%E6%96%B9%E5%BC%8F%20%7C%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E8%A8%98%E8%BF%B0%E8%A8%80%E8%AA%9E%20%7C%20%E4%BD%8D%E7%BD%AE%E3%81%A5%E3%81%91%20%7C%0A%20%20%20%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%0A%20%20%20%20%7C%20numba-cuda%20%7C%20Python%20%7C%20Python%20%E3%81%AE%E3%82%B5%E3%83%96%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%20CUDA%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%B8%20%7C%0A%20%20%20%20%7C%20CuPy%20%E8%A6%81%E7%B4%A0%E6%BC%94%E7%AE%97%20%7C%20%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%20%7C%20NumPy%20%E4%BA%92%E6%8F%9B%20API%E3%80%82%E6%BC%94%E7%AE%97%E3%81%94%E3%81%A8%E3%81%AB%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%20%7C%0A%20%20%20%20%7C%20CuPy%20RawKernel%20%7C%20CUDA%20C%2B%2B%20%7C%20C%2B%2B%20%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%20%7C%0A%20%20%20%20%7C%20PyTorch%20%7C%20%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%20%7C%20%E5%AE%9F%E9%9A%9B%E3%81%AB%E6%9C%80%E3%82%82%E5%BA%83%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E7%B5%8C%E8%B7%AF%20%7C%0A%20%20%20%20%7C%20Triton%20%7C%20Python%20(DSL)%20%7C%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%8D%98%E4%BD%8D%E3%81%A7%E6%9B%B8%E3%81%8F%E3%80%82%E3%82%BF%E3%82%A4%E3%83%AB%E5%88%86%E5%89%B2%E3%81%AF%E8%87%AA%E5%8B%95%20%7C%0A%20%20%20%20%7C%20cuda-python%20%7C%20CUDA%20C%2B%2B%20%7C%20NVIDIA%20%E5%85%AC%E5%BC%8F%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%80%82%E6%9C%80%E3%82%82%E4%BD%8E%E6%B0%B4%E6%BA%96%20%7C%0A%0A%20%20%20%20%E8%A8%88%E6%B8%AC%E3%81%AF%E6%AC%A1%E3%81%AE%202%20%E9%80%9A%E3%82%8A%E3%82%92%E5%88%86%E3%81%91%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20**kernel**%3A%20%E5%85%A5%E5%8A%9B%E3%81%8C%E6%97%A2%E3%81%AB%20GPU%20%E4%B8%8A%E3%81%AB%E3%81%82%E3%82%8B%E7%8A%B6%E6%85%8B%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%A0%E3%81%91%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%80%81%E5%90%8C%E6%9C%9F%E3%81%97%E3%81%A6%E6%B8%AC%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**%2Btransfer**%3A%20%E3%83%9B%E3%82%B9%E3%83%88%E3%81%8B%E3%82%89%E3%81%AE%E8%BB%A2%E9%80%81%E3%83%BB%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AE%9F%E8%A1%8C%E3%83%BB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%B8%E3%81%AE%E5%9B%9E%E5%8F%8E%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E5%90%AB%E3%82%81%E3%81%A6%E6%B8%AC%E3%82%8B%E3%80%82%0A%0A%20%20%20%20GPU%20%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%81%AF%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81**%E5%90%8C%E6%9C%9F%EF%BC%88%60synchronize%60%20%2F%20%60stream.sync()%60%EF%BC%89%E3%82%92%E6%8C%9F%E3%81%BE%E3%81%AA%E3%81%84%E3%81%A8%0A%20%20%20%20%E8%A8%88%E6%B8%AC%E5%80%A4%E3%81%AF%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E6%8A%95%E5%85%A5%E6%99%82%E9%96%93%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86**%E3%80%82%E4%BB%A5%E9%99%8D%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%A7%E5%90%8C%E6%9C%9F%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%95%E3%82%89%E3%81%AB%E3%80%81%E6%AC%A1%E7%AF%80%E3%81%A7%E5%AE%9F%E6%B8%AC%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8A%E3%82%8A%20GPU%20%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AF%E5%BE%85%E3%81%9F%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E8%90%BD%E3%81%A1%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E3%81%A9%E3%81%AE%E8%A8%88%E6%B8%AC%E3%82%82%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E6%B8%88%E3%81%BE%E3%81%9B%E3%81%A6%E3%81%8B%E3%82%89%E8%A1%8C%E3%81%86%E3%80%82%0A%0A%20%20%20%20%E6%9C%80%E5%88%9D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%20GPU%20%E3%81%AE%E6%9C%89%E7%84%A1%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82%E5%88%A4%E5%AE%9A%E3%82%92%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E5%85%88%E9%A0%AD%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%81%93%E3%81%93%E3%81%B8%E7%BD%AE%E3%81%8F%E3%81%AE%E3%81%AF%E3%80%81%0A%20%20%20%20GPU%20%E3%82%92%E4%B8%80%E5%BA%A6%E3%82%82%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%81%A8%E8%A7%A6%E3%81%A3%E3%81%9F%E5%BE%8C%E3%81%A8%E3%81%A7%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%94%9F%E6%88%90%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E6%AF%94%E3%81%B9%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%0A%20%20%20%20%EF%BC%88%E7%B5%90%E6%9E%9C%E3%81%AF%E3%80%8Cfork%20%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%80%8D%E3%81%AE%E7%AF%80%E3%81%A7%E8%A6%8B%E3%82%8B%EF%BC%89%E3%80%82%0A%20%20%20%20GPU%20%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AF%E3%80%81%E4%BB%A5%E9%99%8D%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AF%E8%A1%8C%E3%82%8F%E3%81%9A%E6%AC%A0%E6%B8%AC%E3%81%A8%E3%81%97%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(nbcuda%2C%20pd%2C%20torch)%3A%0A%20%20%20%20%23%20%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%8C%20GPU%20%E3%81%AB%E8%A7%A6%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%93%E3%81%93%E3%81%8C%E6%9C%80%E5%88%9D%0A%20%20%20%20gpu_ready%20%3D%20nbcuda.is_available()%20and%20torch.cuda.is_available()%0A%20%20%20%20if%20gpu_ready%3A%0A%20%20%20%20%20%20%20%20%23%20numba-cuda%200.30%20%E4%BB%A5%E9%99%8D%E3%81%AF%20str%E3%80%81numba%20%E5%86%85%E8%94%B5%E3%81%AE%20CUDA%20%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%AF%20bytes%20%E3%82%92%E8%BF%94%E3%81%99%0A%20%20%20%20%20%20%20%20_raw_name%20%3D%20nbcuda.get_current_device().name%0A%20%20%20%20%20%20%20%20gpu_name%20%3D%20_raw_name.decode()%20if%20isinstance(_raw_name%2C%20bytes)%20else%20str(_raw_name)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20gpu_name%20%3D%20%22N%2FA%22%0A%20%20%20%20pd.DataFrame(%5B%7B%22item%22%3A%20%22GPU%22%2C%20%22value%22%3A%20gpu_name%7D%2C%20%7B%22item%22%3A%20%22gpu_ready%22%2C%20%22value%22%3A%20str(gpu_ready)%7D%5D)%0A%20%20%20%20return%20(gpu_ready%2C)%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20VECTOR_SIZE%20%3D%201%20%3C%3C%2024%0A%20%20%20%20THREADS_PER_BLOCK%20%3D%20256%0A%20%20%20%20BLOCKS_PER_GRID%20%3D%20(VECTOR_SIZE%20%2B%20THREADS_PER_BLOCK%20-%201)%20%2F%2F%20THREADS_PER_BLOCK%0A%20%20%20%20left_host%20%3D%20np.ones(VECTOR_SIZE%2C%20dtype%3Dnp.float32)%0A%20%20%20%20right_host%20%3D%20np.full(VECTOR_SIZE%2C%202.0%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%23%20%E8%AA%AD%E3%81%BF%202%20%E6%9C%AC%20%2B%20%E6%9B%B8%E3%81%8D%201%20%E6%9C%AC%E3%80%82%E5%B8%AF%E5%9F%9F%E3%81%AE%E5%AE%9F%E5%8A%B9%E5%80%A4%E3%82%92%E5%87%BA%E3%81%99%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%BF%E3%81%86%0A%20%20%20%20MOVED_GIGABYTES%20%3D%203%20*%20left_host.nbytes%20%2F%201e9%0A%0A%20%20%20%20CUDA_SOURCE%20%3D%20r%22%22%22%0A%20%20%20%20extern%20%22C%22%20__global__%0A%20%20%20%20void%20add_kernel(const%20float*%20a%2C%20const%20float*%20b%2C%20float*%20c%2C%20int%20n)%20%7B%0A%20%20%20%20%20%20%20%20int%20i%20%3D%20blockDim.x%20*%20blockIdx.x%20%2B%20threadIdx.x%3B%0A%20%20%20%20%20%20%20%20if%20(i%20%3C%20n)%20c%5Bi%5D%20%3D%20a%5Bi%5D%20%2B%20b%5Bi%5D%3B%0A%20%20%20%20%7D%0A%20%20%20%20%22%22%22%0A%20%20%20%20print(f%22%7BVECTOR_SIZE%3D%7D%2C%201%20%E9%85%8D%E5%88%97%E3%81%82%E3%81%9F%E3%82%8A%20%7Bleft_host.nbytes%20%2F%202**20%3A.0f%7D%20MiB%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20BLOCKS_PER_GRID%2C%0A%20%20%20%20%20%20%20%20CUDA_SOURCE%2C%0A%20%20%20%20%20%20%20%20MOVED_GIGABYTES%2C%0A%20%20%20%20%20%20%20%20THREADS_PER_BLOCK%2C%0A%20%20%20%20%20%20%20%20VECTOR_SIZE%2C%0A%20%20%20%20%20%20%20%20left_host%2C%0A%20%20%20%20%20%20%20%20right_host%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E8%A8%88%E6%B8%AC%E3%81%AE%E7%BD%A0%EF%BC%9AGPU%20%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AF%E5%BE%85%E3%81%9F%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E8%90%BD%E3%81%A1%E3%82%8B%0A%0A%20%20%20%20GPU%20%E3%81%AB%E3%81%AF%E9%9B%BB%E5%8A%9B%E7%AE%A1%E7%90%86%E3%81%8C%E3%81%82%E3%82%8A%E3%80%81%E4%BB%95%E4%BA%8B%E3%81%8C%E6%9D%A5%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%81%8C%E7%B6%9A%E3%81%8F%E3%81%A8%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E4%B8%8B%E3%81%92%E3%81%9F%E7%9C%81%E9%9B%BB%E5%8A%9B%E7%8A%B6%E6%85%8B%E3%81%B8%E7%A7%BB%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AF%20GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%89%8B%E5%89%8D%E3%81%A7%2010%20%E7%A7%92%E4%BB%A5%E4%B8%8A%20CPU%20%E3%81%AE%E8%A8%88%E6%B8%AC%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%B8%AC%E3%82%8B%E3%81%A8**%E6%9C%80%E5%88%9D%E3%81%AB%E6%B8%AC%E3%81%A3%E3%81%9F%E6%96%B9%E5%BC%8F%E3%81%A0%E3%81%91%E3%81%8C%E6%A5%B5%E7%AB%AF%E3%81%AB%E9%81%85%E3%81%8F%E5%87%BA%E3%82%8B**%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%80%81%E3%81%9D%E3%81%AE%E8%90%BD%E3%81%A1%E8%BE%BC%E3%81%BF%E3%82%92%E5%AE%9F%E9%9A%9B%E3%81%AB%E6%B8%AC%E3%82%8B%E3%80%82%E6%89%8B%E9%A0%86%E3%81%AF%203%20%E6%AE%B5%E9%9A%8E%E3%80%82%0A%0A%20%20%20%201.%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%201%20%E5%9B%9E%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%92%E6%B8%88%E3%81%BE%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%202.%20%60time.sleep%60%20%E3%81%A7%20GPU%20%E3%82%92%E9%81%8A%E3%81%B0%E3%81%9B%E3%80%81%E7%9C%81%E9%9B%BB%E5%8A%9B%E7%8A%B6%E6%85%8B%E3%81%B8%E8%90%BD%E3%81%A8%E3%81%99%E3%80%82%0A%20%20%20%203.%20%E8%90%BD%E3%81%A1%E3%81%9F%E7%9B%B4%E5%BE%8C%EF%BC%88cold%EF%BC%89%E3%81%A8%E3%80%81%E3%81%97%E3%81%B0%E3%82%89%E3%81%8F%E5%9B%9E%E3%81%97%E3%81%A6%E5%BE%A9%E5%B8%B0%E3%81%95%E3%81%9B%E3%81%9F%E5%BE%8C%EF%BC%88warm%EF%BC%89%E3%81%A7%E5%90%8C%E3%81%98%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%B8%AC%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60nvidia-smi%60%20%E3%81%8B%E3%82%89%E5%8F%96%E3%82%8C%E3%82%8B%E6%80%A7%E8%83%BD%E7%8A%B6%E6%85%8B%EF%BC%88%60pstate%60%EF%BC%89%E3%81%A8%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%82%E4%BD%B5%E8%A8%98%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%60P8%60%20%E3%81%8C%E6%9C%80%E3%82%82%E4%BD%8E%E3%81%84%E7%9C%81%E9%9B%BB%E5%8A%9B%E7%8A%B6%E6%85%8B%E3%80%81%60P0%60%20%2F%20%60P2%60%20%E3%81%8C%E9%AB%98%E8%B2%A0%E8%8D%B7%E6%99%82%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%8C%20%60benchmark%60%20%E3%81%AE%20%60warmup_s%60%20%E3%82%92%E8%A8%AD%E3%81%91%E3%81%A6%E3%81%84%E3%82%8B%E7%90%86%E7%94%B1%E3%81%A7%E3%80%81%E4%BB%A5%E9%99%8D%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AF%E3%81%99%E3%81%B9%E3%81%A6%0A%20%20%20%20%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E5%BE%8C%E3%81%AE%E5%80%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82**GPU%20%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20%E8%A8%88%E6%B8%AC%E5%89%8D%E3%81%AB%E6%95%B0%E7%99%BE%20ms%20%E4%BB%A5%E4%B8%8A%E3%81%BE%E3%82%8F%E3%81%97%E3%81%A6%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8A%E3%81%8F%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82**%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20BLOCKS_PER_GRID%2C%0A%20%20%20%20THREADS_PER_BLOCK%2C%0A%20%20%20%20gpu_ready%2C%0A%20%20%20%20left_host%2C%0A%20%20%20%20nbcuda%2C%0A%20%20%20%20np%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20right_host%2C%0A%20%20%20%20statistics%2C%0A%20%20%20%20subprocess%2C%0A%20%20%20%20time%2C%0A)%3A%0A%20%20%20%20GPU_IDLE_SECONDS%20%3D%2015.0%0A%0A%20%20%20%20def%20gpu_power_state()%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20completed%20%3D%20subprocess.run(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22nvidia-smi%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22--query-gpu%3Dpstate%2Cclocks.mem%2Cpower.draw%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22--format%3Dcsv%2Cnoheader%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20capture_output%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timeout%3D10%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20check%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20completed.stdout.strip().splitlines()%5B0%5D%0A%20%20%20%20%20%20%20%20except%20(OSError%2C%20subprocess.SubprocessError%2C%20IndexError)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22N%2FA%22%0A%0A%20%20%20%20clock_rows%20%3D%20%5B%5D%0A%20%20%20%20if%20not%20gpu_ready%3A%0A%20%20%20%20%20%20%20%20gpu_warm%20%3D%20False%0A%20%20%20%20%20%20%20%20clock_rows.append(%7B%22phase%22%3A%20%22gpu%20unavailable%22%2C%20%22nvidia_smi%22%3A%20%22N%2FA%22%2C%20%22kernel_ms%22%3A%20np.nan%7D)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%40nbcuda.jit%0A%20%20%20%20%20%20%20%20def%20clock_probe_add(a%2C%20b%2C%20c)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20index%20%3D%20nbcuda.grid(1)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20index%20%3C%20c.size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20c%5Bindex%5D%20%3D%20a%5Bindex%5D%20%2B%20b%5Bindex%5D%0A%0A%20%20%20%20%20%20%20%20probe_left%20%3D%20nbcuda.to_device(left_host)%0A%20%20%20%20%20%20%20%20probe_right%20%3D%20nbcuda.to_device(right_host)%0A%20%20%20%20%20%20%20%20probe_out%20%3D%20nbcuda.device_array_like(left_host)%0A%0A%20%20%20%20%20%20%20%20def%20probe_once()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20clock_probe_add%5BBLOCKS_PER_GRID%2C%20THREADS_PER_BLOCK%5D(probe_left%2C%20probe_right%2C%20probe_out)%0A%20%20%20%20%20%20%20%20%20%20%20%20nbcuda.synchronize()%0A%0A%20%20%20%20%20%20%20%20def%20probe_median(repeats%3D5)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20samples%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(repeats)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20probe_once()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20samples.append(time.perf_counter()%20-%20start)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20statistics.median(samples)%20*%201e3%0A%0A%20%20%20%20%20%20%20%20probe_once()%20%20%23%20%E3%81%93%E3%81%93%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%92%E6%B8%88%E3%81%BE%E3%81%9B%E3%82%8B%0A%20%20%20%20%20%20%20%20time.sleep(GPU_IDLE_SECONDS)%20%20%23%20GPU%20%E3%82%92%E9%81%8A%E3%81%B0%E3%81%9B%E3%81%A6%E7%9C%81%E9%9B%BB%E5%8A%9B%E7%8A%B6%E6%85%8B%E3%81%B8%E8%90%BD%E3%81%A8%E3%81%99%0A%20%20%20%20%20%20%20%20clock_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22phase%22%3A%20f%22after%20%7BGPU_IDLE_SECONDS%3A.0f%7Ds%20idle%22%2C%20%22nvidia_smi%22%3A%20gpu_power_state()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22kernel_ms%22%3A%20np.nan%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20clock_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22phase%22%3A%20%22cold%20kernel%22%2C%20%22nvidia_smi%22%3A%20gpu_power_state()%2C%20%22kernel_ms%22%3A%20probe_median()%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_warm_deadline%20%3D%20time.perf_counter()%20%2B%202.0%0A%20%20%20%20%20%20%20%20while%20time.perf_counter()%20%3C%20_warm_deadline%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20probe_once()%0A%20%20%20%20%20%20%20%20clock_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22phase%22%3A%20%22warm%20kernel%22%2C%20%22nvidia_smi%22%3A%20gpu_power_state()%2C%20%22kernel_ms%22%3A%20probe_median()%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpu_warm%20%3D%20True%0A%20%20%20%20pd.DataFrame(clock_rows)%0A%20%20%20%20return%20(gpu_warm%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%9F%BA%E6%BA%96%EF%BC%9ANumPy%20%E3%81%AB%E3%82%88%E3%82%8B%20CPU%20%E5%AE%9F%E8%A1%8C%0A%0A%20%20%20%20%E3%81%BE%E3%81%9A%E6%AF%94%E8%BC%83%E3%81%AE%E5%9F%BA%E6%BA%96%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E5%90%8C%E3%81%98%E5%8A%A0%E7%AE%97%E3%82%92%20NumPy%20%E3%81%A7%20CPU%20%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(benchmark%2C%20left_host%2C%20right_host)%3A%0A%20%20%20%20cpu_row%20%3D%20benchmark(%22numpy%20(CPU)%22%2C%20lambda%3A%20left_host%20%2B%20right_host)%0A%20%20%20%20cpu_row%0A%20%20%20%20return%20(cpu_row%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20numba-cuda%0A%0A%20%20%20%20%60%40cuda.jit%60%20%E3%81%AF%20Python%20%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%20CUDA%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%B8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%60cuda.grid(1)%60%20%E3%81%8C%E3%80%8C%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E7%95%AA%E5%8F%B7%20%C3%97%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%20%2B%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E7%95%AA%E5%8F%B7%E3%80%8D%E3%82%92%E8%BF%94%E3%81%99%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%E3%81%9D%E3%82%8C%E3%82%92%E9%85%8D%E5%88%97%E3%81%AE%E6%B7%BB%E5%AD%97%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%84%E3%80%81%E7%AF%84%E5%9B%B2%E5%A4%96%E3%82%92%20%60if%60%20%E3%81%A7%E5%BC%BE%E3%81%8F%E3%80%82%0A%20%20%20%20%E8%B5%B7%E5%8B%95%E3%81%AF%20%60kernel%5B%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E6%95%B0%2C%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%82%E3%81%9F%E3%82%8A%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%5D(%E5%BC%95%E6%95%B0...)%60%20%E3%81%A8%E6%9B%B8%E3%81%8F%E3%80%82%0A%0A%20%20%20%20**numba%20%E3%81%AE%E5%86%85%E8%94%B5%20CUDA%20%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%AF%E9%9D%9E%E6%8E%A8%E5%A5%A8%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E9%96%8B%E7%99%BA%E3%81%AF%20NVIDIA%20%E3%81%8C%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%0A%20%20%20%20%60numba-cuda%60%20%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%B8%E7%A7%BB%E3%81%A3%E3%81%9F%E3%80%82**%20%60numba-cuda%60%20%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%A8%20%60from%20numba%20import%20cuda%60%0A%20%20%20%20%E3%81%AE%E8%A7%A3%E6%B1%BA%E5%85%88%E3%81%8C%E5%85%A5%E3%82%8C%E6%9B%BF%E3%82%8F%E3%82%8A%E3%80%81%60numba.cuda.__file__%60%20%E3%81%AF%20%60numba_cuda%2Fnumba%2Fcuda%2F__init__.py%60%20%E3%82%92%E6%8C%87%E3%81%99%E3%80%82%0A%20%20%20%20%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%81%8C%E3%80%81%E6%96%B0%E3%81%97%E3%81%84%20CUDA%20%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88%E3%81%B8%E3%81%AE%E8%BF%BD%E9%9A%8F%E3%81%AF%E3%81%93%E3%81%A1%E3%82%89%E3%81%A7%E3%81%97%E3%81%8B%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E5%AE%9F%E9%9A%9B%E3%80%81numba%20%E5%86%85%E8%94%B5%E3%81%AE%E5%AE%9F%E8%A3%85%E3%81%AF%E6%96%B0%E3%81%97%E3%82%81%E3%81%AE%20CUDA%20%E3%81%A8%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E3%81%A8%20PTX%20%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E4%B8%8D%E6%95%B4%E5%90%88%0A%20%20%20%20%EF%BC%88%60CUDA_ERROR_UNSUPPORTED_PTX_VERSION%60%EF%BC%89%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%BB%A2%E9%80%81%E8%BE%BC%E3%81%BF%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%A7%E3%81%AF%E3%80%81%E6%AF%8E%E5%9B%9E%20%60to_device%60%20%E3%81%A7%E9%80%81%E3%82%8A%E7%9B%B4%E3%81%97%20%60copy_to_host%60%20%E3%81%A7%E5%9B%9E%E5%8F%8E%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20BLOCKS_PER_GRID%2C%0A%20%20%20%20THREADS_PER_BLOCK%2C%0A%20%20%20%20benchmark%2C%0A%20%20%20%20gpu_ready%2C%0A%20%20%20%20gpu_warm%2C%0A%20%20%20%20left_host%2C%0A%20%20%20%20nbcuda%2C%0A%20%20%20%20np%2C%0A%20%20%20%20right_host%2C%0A)%3A%0A%20%20%20%20numba_rows%20%3D%20%5B%5D%0A%20%20%20%20%23%20gpu_warm%20%E3%82%92%E6%9D%A1%E4%BB%B6%E3%81%AB%E5%90%AB%E3%82%81%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B%E3%82%BB%E3%83%AB%E3%81%AE%E5%BE%8C%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20if%20not%20(gpu_ready%20and%20gpu_warm)%3A%0A%20%20%20%20%20%20%20%20numba_rows.append(%7B%22case%22%3A%20%22numba-cuda%22%2C%20%22median_ms%22%3A%20np.nan%2C%20%22min_ms%22%3A%20np.nan%7D)%0A%20%20%20%20%20%20%20%20numba_checksum%20%3D%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%40nbcuda.jit%0A%20%20%20%20%20%20%20%20def%20numba_add(a%2C%20b%2C%20c)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20index%20%3D%20nbcuda.grid(1)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20index%20%3C%20c.size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20c%5Bindex%5D%20%3D%20a%5Bindex%5D%20%2B%20b%5Bindex%5D%0A%0A%20%20%20%20%20%20%20%20numba_left%20%3D%20nbcuda.to_device(left_host)%0A%20%20%20%20%20%20%20%20numba_right%20%3D%20nbcuda.to_device(right_host)%0A%20%20%20%20%20%20%20%20numba_out%20%3D%20nbcuda.device_array_like(left_host)%0A%0A%20%20%20%20%20%20%20%20def%20numba_kernel_only()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20numba_add%5BBLOCKS_PER_GRID%2C%20THREADS_PER_BLOCK%5D(numba_left%2C%20numba_right%2C%20numba_out)%0A%20%20%20%20%20%20%20%20%20%20%20%20nbcuda.synchronize()%0A%0A%20%20%20%20%20%20%20%20def%20numba_with_transfer()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20%3D%20nbcuda.to_device(left_host)%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20nbcuda.to_device(right_host)%0A%20%20%20%20%20%20%20%20%20%20%20%20c%20%3D%20nbcuda.device_array_like(left_host)%0A%20%20%20%20%20%20%20%20%20%20%20%20numba_add%5BBLOCKS_PER_GRID%2C%20THREADS_PER_BLOCK%5D(a%2C%20b%2C%20c)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20c.copy_to_host()%0A%0A%20%20%20%20%20%20%20%20numba_rows.append(benchmark(%22numba-cuda%20kernel%22%2C%20numba_kernel_only))%0A%20%20%20%20%20%20%20%20numba_rows.append(benchmark(%22numba-cuda%20%2Btransfer%22%2C%20numba_with_transfer))%0A%20%20%20%20%20%20%20%20numba_checksum%20%3D%20numba_out.copy_to_host()%5B%3A3%5D%0A%20%20%20%20print(f%22%7Bnumba_checksum%3D%7D%22)%0A%20%20%20%20return%20(numba_rows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20CuPy%EF%BC%9A%E8%A6%81%E7%B4%A0%E6%BC%94%E7%AE%97%E3%81%A8%20RawKernel%0A%0A%20%20%20%20CuPy%20%E3%81%AF%20NumPy%20%E4%BA%92%E6%8F%9B%E3%81%AE%20API%20%E3%82%92%20GPU%20%E4%B8%8A%E3%81%A7%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8B%E3%80%82%60a%20%2B%20b%60%20%E3%81%A8%E6%9B%B8%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7%0A%20%20%20%20%E8%A6%81%E7%B4%A0%E3%81%94%E3%81%A8%E3%81%AE%E5%8A%A0%E7%AE%97%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%8C%E7%94%9F%E6%88%90%E3%83%BB%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%95%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%201%20%E8%A1%8C%E3%82%82%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%A6%E3%82%88%E3%81%84%E3%80%82%0A%0A%20%20%20%20%E3%82%88%E3%82%8A%E7%B4%B0%E3%81%8B%E3%81%84%E5%88%B6%E5%BE%A1%E3%81%8C%E8%A6%81%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%20%60cp.RawKernel%60%20%E3%81%AB%20CUDA%20C%2B%2B%20%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%B8%A1%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20%60CUDA_SOURCE%60%20%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%20%60add_kernel%60%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%E5%90%8C%E3%81%98%20C%2B%2B%20%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E5%BE%8C%E6%AE%B5%E3%81%AE%20cuda-python%20%E3%81%A7%E3%82%82%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%A7%E3%80%81**%E5%90%8C%E4%B8%80%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%0A%20%20%20%202%20%E3%81%A4%E3%81%AE%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%9B%E3%82%B9%E3%83%88%20API%20%E3%81%8B%E3%82%89%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B**%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60RawKernel%60%20%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E8%A6%8F%E7%B4%84%E3%81%AF%20%60kernel(grid%2C%20block%2C%20args)%60%20%E3%81%A7%E3%80%81%0A%20%20%20%20%60grid%60%20%E3%81%A8%20%60block%60%20%E3%81%AF%E3%82%BF%E3%83%97%E3%83%AB%E3%80%81%60args%60%20%E3%81%AF%E5%BC%95%E6%95%B0%E3%81%AE%E3%82%BF%E3%83%97%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%82%B9%E3%82%AB%E3%83%A9%E5%BC%95%E6%95%B0%E3%81%AF%20%60np.int32(...)%60%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%9E%8B%E3%82%92%E6%98%8E%E7%A4%BA%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%20C%20%E5%81%B4%E3%81%AE%20%60int%60%20%E3%81%A8%E9%A3%9F%E3%81%84%E9%81%95%E3%81%86%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20BLOCKS_PER_GRID%2C%0A%20%20%20%20CUDA_SOURCE%2C%0A%20%20%20%20THREADS_PER_BLOCK%2C%0A%20%20%20%20VECTOR_SIZE%2C%0A%20%20%20%20benchmark%2C%0A%20%20%20%20cp%2C%0A%20%20%20%20gpu_ready%2C%0A%20%20%20%20gpu_warm%2C%0A%20%20%20%20left_host%2C%0A%20%20%20%20np%2C%0A%20%20%20%20right_host%2C%0A)%3A%0A%20%20%20%20cupy_rows%20%3D%20%5B%5D%0A%20%20%20%20if%20not%20(gpu_ready%20and%20gpu_warm)%3A%0A%20%20%20%20%20%20%20%20cupy_rows.append(%7B%22case%22%3A%20%22cupy%22%2C%20%22median_ms%22%3A%20np.nan%2C%20%22min_ms%22%3A%20np.nan%7D)%0A%20%20%20%20%20%20%20%20cupy_checksum%20%3D%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20cupy_left%20%3D%20cp.asarray(left_host)%0A%20%20%20%20%20%20%20%20cupy_right%20%3D%20cp.asarray(right_host)%0A%20%20%20%20%20%20%20%20cupy_out%20%3D%20cp.empty_like(cupy_left)%0A%20%20%20%20%20%20%20%20cupy_raw_kernel%20%3D%20cp.RawKernel(CUDA_SOURCE%2C%20%22add_kernel%22)%0A%0A%20%20%20%20%20%20%20%20def%20cupy_elementwise()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20cupy_left%20%2B%20cupy_right%0A%20%20%20%20%20%20%20%20%20%20%20%20cp.cuda.Stream.null.synchronize()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20%20%20%20%20def%20cupy_raw()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cupy_raw_kernel(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(BLOCKS_PER_GRID%2C)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(THREADS_PER_BLOCK%2C)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(cupy_left%2C%20cupy_right%2C%20cupy_out%2C%20np.int32(VECTOR_SIZE))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20cp.cuda.Stream.null.synchronize()%0A%0A%20%20%20%20%20%20%20%20def%20cupy_with_transfer()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20%3D%20cp.asarray(left_host)%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20cp.asarray(right_host)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20cp.asnumpy(a%20%2B%20b)%0A%0A%20%20%20%20%20%20%20%20cupy_rows.append(benchmark(%22cupy%20elementwise%22%2C%20cupy_elementwise))%0A%20%20%20%20%20%20%20%20cupy_rows.append(benchmark(%22cupy%20RawKernel%22%2C%20cupy_raw))%0A%20%20%20%20%20%20%20%20cupy_rows.append(benchmark(%22cupy%20%2Btransfer%22%2C%20cupy_with_transfer))%0A%20%20%20%20%20%20%20%20cupy_checksum%20%3D%20cp.asnumpy(cupy_out%5B%3A3%5D)%0A%20%20%20%20print(f%22%7Bcupy_checksum%3D%7D%22)%0A%20%20%20%20return%20(cupy_rows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20PyTorch%20%E3%81%AE%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E6%BC%94%E7%AE%97%0A%0A%20%20%20%20Python%20%E3%81%8B%E3%82%89%20GPU%20%E3%82%92%E4%BD%BF%E3%81%86%E7%B5%8C%E8%B7%AF%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E9%9A%9B%E3%81%AB%E6%9C%80%E3%82%82%E5%BA%83%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%20PyTorch%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%60torch.add(a%2C%20b%2C%20out%3Dc)%60%20%E3%81%A8%E6%9B%B8%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81CuPy%20%E3%81%A8%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AB%E8%A6%81%E7%B4%A0%E3%81%94%E3%81%A8%E3%81%AE%E5%8A%A0%E7%AE%97%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%8C%E8%B5%B0%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9A%E3%81%AB%E6%B8%88%E3%81%BF%E3%80%81%E6%97%A2%E5%AD%98%E3%81%AE%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%99%9B%E3%81%BF%E5%90%88%E3%81%86%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20%60out%3D%60%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%87%BA%E5%8A%9B%E5%85%88%E3%82%92%E4%BD%BF%E3%81%84%E5%9B%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E3%81%9F%E3%81%B3%E3%81%AB%0A%20%20%20%20%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E7%A2%BA%E4%BF%9D%E3%81%AE%E6%99%82%E9%96%93%E3%81%BE%E3%81%A7%E6%B8%AC%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(benchmark%2C%20gpu_ready%2C%20gpu_warm%2C%20left_host%2C%20np%2C%20right_host%2C%20torch)%3A%0A%20%20%20%20torch_rows%20%3D%20%5B%5D%0A%20%20%20%20if%20not%20(gpu_ready%20and%20gpu_warm)%3A%0A%20%20%20%20%20%20%20%20torch_rows.append(%7B%22case%22%3A%20%22torch%22%2C%20%22median_ms%22%3A%20np.nan%2C%20%22min_ms%22%3A%20np.nan%7D)%0A%20%20%20%20%20%20%20%20torch_checksum%20%3D%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20torch_left%20%3D%20torch.from_numpy(left_host).cuda()%0A%20%20%20%20%20%20%20%20torch_right%20%3D%20torch.from_numpy(right_host).cuda()%0A%20%20%20%20%20%20%20%20torch_out%20%3D%20torch.empty_like(torch_left)%0A%0A%20%20%20%20%20%20%20%20def%20torch_kernel_only()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.add(torch_left%2C%20torch_right%2C%20out%3Dtorch_out)%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.cuda.synchronize()%0A%0A%20%20%20%20%20%20%20%20def%20torch_with_transfer()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20%3D%20torch.from_numpy(left_host).cuda()%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20torch.from_numpy(right_host).cuda()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20(a%20%2B%20b).cpu().numpy()%0A%0A%20%20%20%20%20%20%20%20torch_rows.append(benchmark(%22torch%20kernel%22%2C%20torch_kernel_only))%0A%20%20%20%20%20%20%20%20torch_rows.append(benchmark(%22torch%20%2Btransfer%22%2C%20torch_with_transfer))%0A%20%20%20%20%20%20%20%20torch_checksum%20%3D%20torch_out%5B%3A3%5D.cpu().numpy()%0A%20%20%20%20print(f%22%7Btorch_checksum%3D%7D%22)%0A%20%20%20%20return%20(torch_rows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Triton%0A%0A%20%20%20%20Triton%20%E3%81%AF%20GPU%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E7%94%A8%E3%81%AE%20Python%20DSL%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82numba-cuda%20%E3%82%84%20CUDA%20C%2B%2B%20%E3%81%8C%0A%20%20%20%20**1%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AE%E5%87%A6%E7%90%86**%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%AE%E3%81%AB%E5%AF%BE%E3%81%97%E3%80%81Triton%20%E3%81%AF%20**1%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E6%8B%85%E5%BD%93%E3%81%99%E3%82%8B%E3%82%BF%E3%82%A4%E3%83%AB**%E3%82%92%E6%9B%B8%E3%81%8F%E3%80%82%0A%20%20%20%20%60tl.arange(0%2C%20BLOCK)%60%20%E3%81%A7%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%86%85%E3%81%AE%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E5%88%97%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%0A%20%20%20%20%60tl.load%60%20%2F%20%60tl.store%60%20%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%E3%81%99%E3%82%8B%E3%80%82%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%81%A8%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%8C%96%E3%81%AF%0A%20%20%20%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%8C%E6%B1%BA%E3%82%81%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%BC%95%E6%95%B0%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AB%E3%81%AF%20PyTorch%20%E3%81%AE%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%B8%A1%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%20%60BLOCK%60%20%E3%81%AF%20%60tl.constexpr%60%20%E3%81%AA%E3%81%AE%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E5%AE%9A%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%82%8F%E3%82%8C%E3%80%81%0A%20%20%20%20%E5%80%A4%E3%81%94%E3%81%A8%E3%81%AB%E5%88%A5%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%8C%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20Triton%20%E3%81%AF%20%60torch%60%20%E3%81%AE%E4%BE%9D%E5%AD%98%E3%81%A8%E3%81%97%E3%81%A6%E5%85%A5%E3%82%8B%E3%81%8C%E3%80%81%E5%8D%98%E7%8B%AC%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%97%E3%81%A6%E3%82%82%E5%AE%A3%E8%A8%80%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20THREADS_PER_BLOCK%2C%0A%20%20%20%20VECTOR_SIZE%2C%0A%20%20%20%20benchmark%2C%0A%20%20%20%20gpu_ready%2C%0A%20%20%20%20gpu_warm%2C%0A%20%20%20%20left_host%2C%0A%20%20%20%20np%2C%0A%20%20%20%20right_host%2C%0A%20%20%20%20torch%2C%0A%20%20%20%20triton%2C%0A)%3A%0A%20%20%20%20import%20triton.language%20as%20tl%0A%0A%20%20%20%20triton_rows%20%3D%20%5B%5D%0A%20%20%20%20if%20not%20(gpu_ready%20and%20gpu_warm)%3A%0A%20%20%20%20%20%20%20%20triton_rows.append(%7B%22case%22%3A%20%22triton%22%2C%20%22median_ms%22%3A%20np.nan%2C%20%22min_ms%22%3A%20np.nan%7D)%0A%20%20%20%20%20%20%20%20triton_checksum%20%3D%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%40triton.jit%0A%20%20%20%20%20%20%20%20def%20triton_add(a_ptr%2C%20b_ptr%2C%20c_ptr%2C%20n%2C%20BLOCK%3A%20tl.constexpr)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20offsets%20%3D%20tl.program_id(0)%20*%20BLOCK%20%2B%20tl.arange(0%2C%20BLOCK)%0A%20%20%20%20%20%20%20%20%20%20%20%20mask%20%3D%20offsets%20%3C%20n%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20%3D%20tl.load(a_ptr%20%2B%20offsets%2C%20mask%3Dmask)%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20tl.load(b_ptr%20%2B%20offsets%2C%20mask%3Dmask)%0A%20%20%20%20%20%20%20%20%20%20%20%20tl.store(c_ptr%20%2B%20offsets%2C%20a%20%2B%20b%2C%20mask%3Dmask)%0A%0A%20%20%20%20%20%20%20%20triton_left%20%3D%20torch.from_numpy(left_host).cuda()%0A%20%20%20%20%20%20%20%20triton_right%20%3D%20torch.from_numpy(right_host).cuda()%0A%20%20%20%20%20%20%20%20triton_out%20%3D%20torch.empty_like(triton_left)%0A%20%20%20%20%20%20%20%20triton_grid%20%3D%20(triton.cdiv(VECTOR_SIZE%2C%20THREADS_PER_BLOCK)%2C)%0A%0A%20%20%20%20%20%20%20%20def%20triton_kernel_only()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20triton_add%5Btriton_grid%5D(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20triton_left%2C%20triton_right%2C%20triton_out%2C%20VECTOR_SIZE%2C%20BLOCK%3DTHREADS_PER_BLOCK%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.cuda.synchronize()%0A%0A%20%20%20%20%20%20%20%20triton_rows.append(benchmark(%22triton%20kernel%22%2C%20triton_kernel_only))%0A%20%20%20%20%20%20%20%20triton_checksum%20%3D%20triton_out%5B%3A3%5D.cpu().numpy()%0A%20%20%20%20print(f%22%7Btriton_checksum%3D%7D%22)%0A%20%20%20%20return%20(triton_rows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20cuda-python%20(cuda.core)%0A%0A%20%20%20%20%60cuda-python%60%20%E3%81%AF%20NVIDIA%20%E5%85%AC%E5%BC%8F%E3%81%AE%20Python%20%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E3%80%812%20%E5%B1%A4%E3%81%AB%E5%88%86%E3%81%8B%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60cuda.bindings%60%3A%20CUDA%20Driver%20%2F%20Runtime%20API%20%E3%82%92%E3%81%BB%E3%81%BC%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%86%99%E3%81%97%E3%81%9F%E8%96%84%E3%81%84%E5%B1%A4%E3%80%82%0A%20%20%20%20-%20%60cuda.core%60%3A%20%E3%81%9D%E3%81%AE%E4%B8%8A%E3%81%AE%20Python%20%E3%82%89%E3%81%97%E3%81%84%E5%B1%A4%E3%80%82%60Device%60%20%2F%20%60Program%60%20%2F%20%60Buffer%60%20%2F%0A%20%20%20%20%20%20%60LaunchConfig%60%20%2F%20%60launch%60%20%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20%60cuda.core%60%20%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81CuPy%20RawKernel%20%E3%81%A8**%E5%90%8C%E3%81%98%20CUDA%20C%2B%2B%20%E3%82%BD%E3%83%BC%E3%82%B9**%E3%82%92%0A%20%20%20%20NVRTC%20%E3%81%A7%20cubin%20%E3%81%B8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%97%E3%80%81%60launch%60%20%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%60ProgramOptions(arch%3D...)%60%20%E3%81%AB%20%60sm_86%60%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%82%92%E6%B8%A1%E3%81%99%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%60Device().arch%60%20%E3%81%8B%E3%82%89%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%83%9B%E3%82%B9%E3%83%88%E5%81%B4%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AF%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%AD%E3%83%83%E3%82%AF%EF%BC%88pinned%EF%BC%89%E3%81%A7%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%60Buffer.copy_from%60%20%2F%20%60copy_to%60%20%E3%81%AF%20Buffer%20%E3%81%A9%E3%81%86%E3%81%97%E3%81%AE%E8%BB%A2%E9%80%81%E3%81%97%E3%81%8B%E5%8F%97%E3%81%91%E4%BB%98%E3%81%91%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20NumPy%20%E9%85%8D%E5%88%97%E3%81%A8%E7%9B%B4%E6%8E%A5%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%80%82%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%82%92%20%60ctypes%60%20%E7%B5%8C%E7%94%B1%E3%81%A7%20NumPy%20%E9%85%8D%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%E8%A6%8B%E3%82%8B%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%20%60host_view%60%20%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E6%89%8B%E9%96%93%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%80%8C%E6%9C%80%E3%82%82%E4%BD%8E%E6%B0%B4%E6%BA%96%E3%81%A7%E3%81%82%E3%82%8B%E3%80%8D%E3%81%93%E3%81%A8%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20BLOCKS_PER_GRID%2C%0A%20%20%20%20CUDA_SOURCE%2C%0A%20%20%20%20THREADS_PER_BLOCK%2C%0A%20%20%20%20VECTOR_SIZE%2C%0A%20%20%20%20benchmark%2C%0A%20%20%20%20ccore%2C%0A%20%20%20%20ctypes%2C%0A%20%20%20%20gpu_ready%2C%0A%20%20%20%20gpu_warm%2C%0A%20%20%20%20left_host%2C%0A%20%20%20%20np%2C%0A%20%20%20%20right_host%2C%0A)%3A%0A%20%20%20%20cuda_python_rows%20%3D%20%5B%5D%0A%20%20%20%20if%20not%20(gpu_ready%20and%20gpu_warm)%3A%0A%20%20%20%20%20%20%20%20cuda_python_rows.append(%7B%22case%22%3A%20%22cuda-python%22%2C%20%22median_ms%22%3A%20np.nan%2C%20%22min_ms%22%3A%20np.nan%7D)%0A%20%20%20%20%20%20%20%20cuda_python_checksum%20%3D%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20cuda_device%20%3D%20ccore.Device()%0A%20%20%20%20%20%20%20%20cuda_device.set_current()%0A%20%20%20%20%20%20%20%20cuda_stream%20%3D%20cuda_device.create_stream()%0A%20%20%20%20%20%20%20%20cuda_program%20%3D%20ccore.Program(%0A%20%20%20%20%20%20%20%20%20%20%20%20CUDA_SOURCE%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22c%2B%2B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ccore.ProgramOptions(arch%3Df%22sm_%7Bcuda_device.arch%7D%22%2C%20std%3D%22c%2B%2B17%22)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20cuda_kernel%20%3D%20cuda_program.compile(%22cubin%22).get_kernel(%22add_kernel%22)%0A%0A%20%20%20%20%20%20%20%20def%20host_view(buffer)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pointer%20%3D%20ctypes.cast(int(buffer.handle)%2C%20ctypes.POINTER(ctypes.c_float))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20np.ctypeslib.as_array(pointer%2C%20shape%3D(VECTOR_SIZE%2C))%0A%0A%20%20%20%20%20%20%20%20cuda_nbytes%20%3D%20left_host.nbytes%0A%20%20%20%20%20%20%20%20cuda_pinned%20%3D%20ccore.LegacyPinnedMemoryResource()%0A%20%20%20%20%20%20%20%20cuda_host_left%20%3D%20cuda_pinned.allocate(cuda_nbytes)%0A%20%20%20%20%20%20%20%20cuda_host_right%20%3D%20cuda_pinned.allocate(cuda_nbytes)%0A%20%20%20%20%20%20%20%20cuda_host_out%20%3D%20cuda_pinned.allocate(cuda_nbytes)%0A%20%20%20%20%20%20%20%20host_view(cuda_host_left)%5B%3A%5D%20%3D%20left_host%0A%20%20%20%20%20%20%20%20host_view(cuda_host_right)%5B%3A%5D%20%3D%20right_host%0A%0A%20%20%20%20%20%20%20%20cuda_left%20%3D%20cuda_device.allocate(cuda_nbytes%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20cuda_right%20%3D%20cuda_device.allocate(cuda_nbytes%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20cuda_out%20%3D%20cuda_device.allocate(cuda_nbytes%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20cuda_host_left.copy_to(cuda_left%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20cuda_host_right.copy_to(cuda_right%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20cuda_stream.sync()%0A%20%20%20%20%20%20%20%20cuda_config%20%3D%20ccore.LaunchConfig(grid%3D(BLOCKS_PER_GRID%2C)%2C%20block%3D(THREADS_PER_BLOCK%2C))%0A%0A%20%20%20%20%20%20%20%20def%20cuda_python_kernel_only()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ccore.launch(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_stream%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_config%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_kernel%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_left%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_right%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_out%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.int32(VECTOR_SIZE)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20cuda_stream.sync()%0A%0A%20%20%20%20%20%20%20%20def%20cuda_python_with_transfer()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cuda_host_left.copy_to(cuda_left%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20%20%20%20%20cuda_host_right.copy_to(cuda_right%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20%20%20%20%20ccore.launch(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_stream%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_config%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_kernel%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_left%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_right%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuda_out%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.int32(VECTOR_SIZE)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20cuda_out.copy_to(cuda_host_out%2C%20stream%3Dcuda_stream)%0A%20%20%20%20%20%20%20%20%20%20%20%20cuda_stream.sync()%0A%0A%20%20%20%20%20%20%20%20cuda_python_rows.append(benchmark(%22cuda-python%20kernel%22%2C%20cuda_python_kernel_only))%0A%20%20%20%20%20%20%20%20cuda_python_rows.append(benchmark(%22cuda-python%20%2Btransfer%22%2C%20cuda_python_with_transfer))%0A%20%20%20%20%20%20%20%20cuda_python_checksum%20%3D%20host_view(cuda_host_out)%5B%3A3%5D.copy()%0A%20%20%20%20print(f%22%7Bcuda_python_checksum%3D%7D%22)%0A%20%20%20%20return%20(cuda_python_rows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20vector%20add%20%E3%81%AE%E7%B5%90%E6%9E%9C%0A%0A%20%20%20%206%20%E6%96%B9%E5%BC%8F%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%AE%9F%E5%8A%B9%E3%83%A1%E3%83%A2%E3%83%AA%E5%B8%AF%E5%9F%9F%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E4%B8%A6%E3%81%B9%E3%82%8B%E3%80%82%60bandwidth_GB_per_s%60%20%E3%81%AF%0A%20%20%20%20%E3%80%8C%E8%AA%AD%E3%81%BF%202%20%E6%9C%AC%20%2B%20%E6%9B%B8%E3%81%8D%201%20%E6%9C%AC%E3%80%8D%E3%81%AE%203%20%E9%85%8D%E5%88%97%E5%88%86%E3%81%AE%E3%83%90%E3%82%A4%E3%83%88%E6%95%B0%E3%82%92%E6%89%80%E8%A6%81%E6%99%82%E9%96%93%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E5%80%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%AA%AD%E3%81%BF%E6%96%B9%E3%81%AE%E8%A6%81%E7%82%B9%E3%81%AF%203%20%E3%81%A4%E3%80%82%0A%0A%20%20%20%201.%20**kernel%20%E5%90%8C%E5%A3%AB%E3%81%AF%E3%81%BB%E3%81%BC%E6%A8%AA%E4%B8%A6%E3%81%B3%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82**%20%E5%B8%AF%E5%9F%9F%E5%BE%8B%E9%80%9F%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%20%20%20%E3%81%A9%E3%81%AE%E6%96%B9%E5%BC%8F%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%A6%E3%82%82%20GPU%20%E3%81%AE%E5%AE%9F%E5%8A%B9%E5%B8%AF%E5%9F%9F%E3%81%8C%E4%B8%8A%E9%99%90%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E6%96%B9%E5%BC%8F%E3%81%AE%E9%81%B8%E6%8A%9E%E3%81%AF%E9%80%9F%E5%BA%A6%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%0A%20%20%20%20%20%20%20%E8%A8%98%E8%BF%B0%E6%80%A7%E3%83%BB%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%83%BB%E6%97%A2%E5%AD%98%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%81%AE%E7%9B%B8%E6%80%A7%E3%81%A7%E6%B1%BA%E3%82%81%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%202.%20**%E8%BB%A2%E9%80%81%E3%82%92%E5%90%AB%E3%82%81%E3%82%8B%E3%81%A8%20CPU%20%E3%82%88%E3%82%8A%E9%81%85%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%86%E3%82%8B%E3%80%82**%20PCIe%20%E3%81%AE%E5%B8%AF%E5%9F%9F%E3%81%AF%20GPU%20%E3%81%AE%0A%20%20%20%20%20%20%20%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2%E3%83%AA%E5%B8%AF%E5%9F%9F%E3%82%88%E3%82%8A%201%20%E6%A1%81%E5%B0%8F%E3%81%95%E3%81%84%E3%80%82%E5%8A%A0%E7%AE%97%201%20%E5%9B%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%BE%80%E5%BE%A9%E3%81%95%E3%81%9B%E3%82%8B%E3%81%A8%0A%20%20%20%20%20%20%20%E8%BB%A2%E9%80%81%E3%81%A0%E3%81%91%E3%81%A7%E6%99%82%E9%96%93%E3%81%8C%E5%9F%8B%E3%81%BE%E3%82%8B%E3%80%82GPU%20%E3%81%8C%E5%8A%B9%E3%81%8F%E3%81%AE%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%20GPU%20%E4%B8%8A%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%9F%E3%81%BE%E3%81%BE%0A%20%20%20%20%20%20%20%E8%A4%87%E6%95%B0%E3%81%AE%E6%BC%94%E7%AE%97%E3%82%92%E9%87%8D%E3%81%AD%E3%82%89%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%203.%20**%60%2Btransfer%60%20%E3%81%AE%E8%A1%8C%E3%81%AF%E6%A8%AA%E4%B8%A6%E3%81%B3%E3%81%A7%E6%AF%94%E3%81%B9%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84%E3%80%82**%20%E6%9D%A1%E4%BB%B6%E3%82%92%E3%81%9D%E3%82%8D%E3%81%88%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%20%20%20numba-cuda%E3%83%BBCuPy%E3%83%BBPyTorch%20%E3%81%AE%E8%A1%8C%E3%81%AF%E3%80%81%E6%AF%8E%E5%9B%9E%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%97%E7%9B%B4%E3%81%97%E3%80%81%0A%20%20%20%20%20%20%20%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E5%8F%AF%E8%83%BD%E3%81%AA%EF%BC%88pageable%EF%BC%89%E3%83%9B%E3%82%B9%E3%83%88%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8B%E3%82%89%E8%BB%A2%E9%80%81%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20PyTorch%20%E3%81%AF%E3%81%95%E3%82%89%E3%81%AB%E7%B5%90%E6%9E%9C%E3%81%AE%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E3%82%82%E6%AF%8E%E5%9B%9E%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E3%81%93%E3%81%AE%203%20%E3%81%A4%E3%81%AE%E4%B8%AD%E3%81%A7%E3%82%82%E6%9D%A1%E4%BB%B6%E3%81%8C%E9%81%95%E3%81%86%E3%80%82%0A%20%20%20%20%20%20%20cuda-python%20%E3%81%AE%E8%A1%8C%E3%81%AF%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%81%B4%E3%82%82%E3%83%9B%E3%82%B9%E3%83%88%E5%81%B4%E3%82%82%E7%A2%BA%E4%BF%9D%E6%B8%88%E3%81%BF%E3%81%A7%E3%80%81%E3%81%97%E3%81%8B%E3%82%82%E3%83%9B%E3%82%B9%E3%83%88%E5%81%B4%E3%81%AF%0A%20%20%20%20%20%20%20%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%AD%E3%83%83%E3%82%AF%E6%B8%88%E3%81%BF%EF%BC%88pinned%EF%BC%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82pinned%20%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AF%20DMA%20%E3%81%A7%E7%9B%B4%E6%8E%A5%E8%BB%A2%E9%80%81%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%9F%E3%82%81%0A%20%20%20%20%20%20%20%E4%B8%AD%E9%96%93%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC%E3%81%8C%E8%A6%81%E3%82%89%E3%81%9A%E3%80%81%E7%A2%BA%E4%BF%9D%E3%81%AE%E6%89%8B%E9%96%93%E3%81%A8%E5%BC%95%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%AB%E8%BB%A2%E9%80%81%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E9%80%9F%E3%81%8F%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20%E3%81%93%E3%81%AE%E5%B7%AE%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%95%B0%E5%80%A4%E3%81%AB%E5%87%BA%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20MOVED_GIGABYTES%2C%0A%20%20%20%20cpu_row%2C%0A%20%20%20%20cuda_python_rows%2C%0A%20%20%20%20cupy_rows%2C%0A%20%20%20%20numba_rows%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20torch_rows%2C%0A%20%20%20%20triton_rows%2C%0A)%3A%0A%20%20%20%20all_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20cpu_row%2C%0A%20%20%20%20%20%20%20%20*numba_rows%2C%0A%20%20%20%20%20%20%20%20*cupy_rows%2C%0A%20%20%20%20%20%20%20%20*torch_rows%2C%0A%20%20%20%20%20%20%20%20*triton_rows%2C%0A%20%20%20%20%20%20%20%20*cuda_python_rows%2C%0A%20%20%20%20%5D%0A%20%20%20%20summary%20%3D%20pd.DataFrame(all_rows)%0A%20%20%20%20summary%5B%22bandwidth_GB_per_s%22%5D%20%3D%20MOVED_GIGABYTES%20%2F%20(summary%5B%22min_ms%22%5D%20%2F%201e3)%0A%20%20%20%20summary%5B%22speedup_vs_cpu%22%5D%20%3D%20cpu_row%5B%22min_ms%22%5D%20%2F%20summary%5B%22min_ms%22%5D%0A%20%20%20%20summary.round(3)%0A%20%20%20%20return%20(summary%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%9E%8D%E5%90%88%EF%BC%9A%E6%BC%94%E7%AE%97%E3%82%92%201%20%E3%81%A4%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%0A%0A%20%20%20%20%E4%B8%8A%E3%81%AE%E6%AF%94%E8%BC%83%E3%81%A7%E6%96%B9%E5%BC%8F%E3%81%AB%E3%82%88%E3%82%8B%E5%B7%AE%E3%81%8C%E5%87%BA%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%AF%E3%80%81%E9%A1%8C%E6%9D%90%E3%81%8C%E5%8A%A0%E7%AE%97%201%20%E5%9B%9E%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%20%60a%20*%20b%20%2B%20a%20-%20b%20*%20b%60%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%E6%BC%94%E7%AE%97%E3%82%92%E7%B9%8B%E3%81%92%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E6%96%B9%E5%BC%8F%E3%81%AB%E3%82%88%E3%82%8B%E5%A4%A7%E3%81%8D%E3%81%AA%E5%B7%AE%E3%81%8C%E5%87%BA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20NumPy%20%E4%BA%92%E6%8F%9B%E3%81%AE%20API%EF%BC%88CuPy%20%E3%81%AE%E8%A6%81%E7%B4%A0%E6%BC%94%E7%AE%97%E3%80%81PyTorch%20%E3%81%AE%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E6%BC%94%E7%AE%97%EF%BC%89%E3%81%AF%E3%80%81%0A%20%20%20%20%E5%BC%8F%E3%82%92**%E6%BC%94%E7%AE%97%E3%81%94%E3%81%A8%E3%81%AB%E5%88%A5%E3%80%85%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB**%E3%81%B8%E5%88%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%80%82%E4%B8%8A%E3%81%AE%E5%BC%8F%E3%81%AA%E3%82%89%0A%0A%20%20%20%201.%20%60t1%20%3D%20a%20*%20b%60%EF%BC%88%24a%24%2C%20%24b%24%20%E3%82%92%E8%AA%AD%E3%81%BF%20%24t_1%24%20%E3%82%92%E6%9B%B8%E3%81%8F%EF%BC%89%0A%20%20%20%202.%20%60t2%20%3D%20t1%20%2B%20a%60%0A%20%20%20%203.%20%60t3%20%3D%20b%20*%20b%60%0A%20%20%20%204.%20%60t4%20%3D%20t2%20-%20t3%60%0A%0A%20%20%20%20%E3%81%AE%204%20%E5%9B%9E%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97%E3%80%81%E3%81%9D%E3%81%AE%E3%81%9F%E3%81%B3%E3%81%AB%E4%B8%AD%E9%96%93%E9%85%8D%E5%88%97%E3%82%92%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%B8%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E7%9B%B4%E3%81%99%E3%80%82%0A%20%20%20%20%E7%B4%A0%E6%9C%B4%E3%81%AB%E6%95%B0%E3%81%88%E3%82%8C%E3%81%B0%E9%85%8D%E5%88%97%2011%E3%80%9C12%20%E6%9C%AC%E3%81%B6%E3%82%93%E3%81%AE%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20**%E8%9E%8D%E5%90%88**%E3%81%99%E3%82%8B%E3%81%A8%E3%80%811%20%E8%A6%81%E7%B4%A0%E3%81%AB%E3%81%A4%E3%81%8D%20%24a%24%20%E3%81%A8%20%24b%24%20%E3%82%92%201%20%E5%9B%9E%E8%AA%AD%E3%82%93%E3%81%A7%E8%A8%88%E7%AE%97%E3%81%97%E3%80%81%E7%B5%90%E6%9E%9C%E3%82%92%201%20%E5%9B%9E%E6%9B%B8%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7%E6%B8%88%E3%82%80%E3%80%82%0A%20%20%20%20%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%E3%81%AF%E9%85%8D%E5%88%97%203%20%E6%9C%AC%E3%81%B6%E3%82%93%E3%81%AB%E6%B8%9B%E3%82%8B%E3%80%82%E5%B8%AF%E5%9F%9F%E5%BE%8B%E9%80%9F%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%81%93%E3%81%AE%E6%AF%94%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E9%80%9F%E5%BA%A6%E6%AF%94%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%9E%8D%E5%90%88%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%202%20%E3%81%A4%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60cupy.fuse()%60%3A%20%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81CuPy%20%E3%81%8C%E5%BC%8F%E3%82%92%201%20%E3%81%A4%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%B8%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%60torch.compile()%60%3A%20PyTorch%20%E3%81%8C%E8%A8%88%E7%AE%97%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E8%BF%BD%E8%B7%A1%E3%81%97%E3%80%81**Triton%20%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90**%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E6%89%8B%E6%9B%B8%E3%81%8D%E3%81%AE%20Triton%20%E3%81%A8%E5%90%8C%E3%81%98%E5%9C%9F%E4%BF%B5%E3%81%AB%E8%87%AA%E5%8B%95%E3%81%A7%E8%BC%89%E3%82%8B%E3%80%82%E5%88%9D%E5%9B%9E%E3%81%AF%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%8C%E8%B5%B0%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%20%20%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E6%99%82%E9%96%93%E3%82%92%E5%88%A5%E3%81%AB%E6%B8%AC%E3%81%A3%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20VECTOR_SIZE%2C%0A%20%20%20%20benchmark%2C%0A%20%20%20%20cp%2C%0A%20%20%20%20gpu_ready%2C%0A%20%20%20%20gpu_warm%2C%0A%20%20%20%20left_host%2C%0A%20%20%20%20np%2C%0A%20%20%20%20right_host%2C%0A%20%20%20%20time%2C%0A%20%20%20%20torch%2C%0A)%3A%0A%20%20%20%20fusion_rows%20%3D%20%5B%5D%0A%20%20%20%20if%20not%20(gpu_ready%20and%20gpu_warm)%3A%0A%20%20%20%20%20%20%20%20fusion_rows.append(%7B%22case%22%3A%20%22fusion%22%2C%20%22median_ms%22%3A%20np.nan%2C%20%22min_ms%22%3A%20np.nan%7D)%0A%20%20%20%20%20%20%20%20fusion_checksums%20%3D%20None%0A%20%20%20%20%20%20%20%20torch_compile_warmup_s%20%3D%20np.nan%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20fuse_left%20%3D%20cp.asarray(left_host)%0A%20%20%20%20%20%20%20%20fuse_right%20%3D%20cp.asarray(right_host)%0A%0A%20%20%20%20%20%20%20%20def%20cupy_eager_expression()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20fuse_left%20*%20fuse_right%20%2B%20fuse_left%20-%20fuse_right%20*%20fuse_right%0A%20%20%20%20%20%20%20%20%20%20%20%20cp.cuda.Stream.null.synchronize()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20%20%20%20%20%40cp.fuse()%0A%20%20%20%20%20%20%20%20def%20cupy_fused_expression(a%2C%20b)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20a%20*%20b%20%2B%20a%20-%20b%20*%20b%0A%0A%20%20%20%20%20%20%20%20def%20cupy_fused()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20cupy_fused_expression(fuse_left%2C%20fuse_right)%0A%20%20%20%20%20%20%20%20%20%20%20%20cp.cuda.Stream.null.synchronize()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20%20%20%20%20torch_fuse_left%20%3D%20torch.from_numpy(left_host).cuda()%0A%20%20%20%20%20%20%20%20torch_fuse_right%20%3D%20torch.from_numpy(right_host).cuda()%0A%0A%20%20%20%20%20%20%20%20def%20torch_eager_expression()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch_fuse_left%20*%20torch_fuse_right%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20torch_fuse_left%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-%20torch_fuse_right%20*%20torch_fuse_right%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.cuda.synchronize()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20%20%20%20%20compiled_expression%20%3D%20torch.compile(lambda%20a%2C%20b%3A%20a%20*%20b%20%2B%20a%20-%20b%20*%20b)%0A%20%20%20%20%20%20%20%20_warmup_start%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20compiled_expression(torch_fuse_left%2C%20torch_fuse_right)%0A%20%20%20%20%20%20%20%20torch.cuda.synchronize()%0A%20%20%20%20%20%20%20%20torch_compile_warmup_s%20%3D%20time.perf_counter()%20-%20_warmup_start%0A%0A%20%20%20%20%20%20%20%20def%20torch_compiled()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20compiled_expression(torch_fuse_left%2C%20torch_fuse_right)%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.cuda.synchronize()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20%20%20%20%20fusion_rows.append(benchmark(%22cupy%20eager%20(4%20kernels)%22%2C%20cupy_eager_expression))%0A%20%20%20%20%20%20%20%20fusion_rows.append(benchmark(%22cupy.fuse%22%2C%20cupy_fused))%0A%20%20%20%20%20%20%20%20fusion_rows.append(benchmark(%22torch%20eager%20(4%20kernels)%22%2C%20torch_eager_expression))%0A%20%20%20%20%20%20%20%20fusion_rows.append(benchmark(%22torch.compile%20(triton)%22%2C%20torch_compiled))%0A%20%20%20%20%20%20%20%20fusion_checksums%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20float(cupy_eager_expression()%5B0%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20float(cupy_fused()%5B0%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20float(torch_eager_expression()%5B0%5D.item())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20float(torch_compiled()%5B0%5D.item())%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20print(f%22%7Bfusion_checksums%3D%7D%22)%0A%20%20%20%20print(f%22torch.compile%20warmup%3A%20%7Btorch_compile_warmup_s%3A.1f%7D%20s%22)%0A%20%20%20%20print(f%22array%20size%3A%20%7BVECTOR_SIZE%7D%20elements%22)%0A%20%20%20%20return%20(fusion_rows%2C)%0A%0A%0A%40app.cell%0Adef%20_(cupy_rows%2C%20fusion_rows%2C%20pd)%3A%0A%20%20%20%20%23%20vector%20add%20%E3%81%AE%20CuPy%20%E8%A6%81%E7%B4%A0%E6%BC%94%E7%AE%97%E3%81%AF%E3%80%8C%E8%AA%AD%E3%81%BF%202%20%2B%20%E6%9B%B8%E3%81%8D%201%E3%80%8D%E3%81%AE%203%20%E3%83%91%E3%82%B9%E3%80%82%E3%81%93%E3%82%8C%E3%82%92%E5%9F%BA%E6%BA%96%E3%81%AB%E3%80%81%0A%20%20%20%20%23%20%E8%9E%8D%E5%90%88%E5%89%8D%E5%BE%8C%E3%81%AE%E6%89%80%E8%A6%81%E6%99%82%E9%96%93%E3%81%8C%E4%BD%95%E3%83%91%E3%82%B9%E7%9B%B8%E5%BD%93%E3%81%8B%E3%82%92%E5%AE%9F%E6%B8%AC%E3%81%8B%E3%82%89%E9%80%86%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20reference_ms%20%3D%20next(row%5B%22min_ms%22%5D%20for%20row%20in%20cupy_rows%20if%20row%5B%22case%22%5D%20%3D%3D%20%22cupy%20elementwise%22)%0A%20%20%20%20fusion_summary%20%3D%20pd.DataFrame(fusion_rows)%0A%20%20%20%20fusion_summary%5B%22array_passes%22%5D%20%3D%203%20*%20fusion_summary%5B%22min_ms%22%5D%20%2F%20reference_ms%0A%20%20%20%20fusion_summary%5B%22speedup_vs_eager%22%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20fusion_summary%5B%22min_ms%22%5D.iloc%5B0%5D%20%2F%20fusion_summary%5B%22min_ms%22%5D%0A%20%20%20%20)%0A%20%20%20%20fusion_summary.round(2)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%60array_passes%60%20%E3%81%AF%E3%80%81vector%20add%20%E3%81%AE%20CuPy%20%E8%A6%81%E7%B4%A0%E6%BC%94%E7%AE%97%EF%BC%88%E8%AA%AD%E3%81%BF%202%20%E6%9C%AC%20%2B%20%E6%9B%B8%E3%81%8D%201%20%E6%9C%AC%20%3D%203%20%E3%83%91%E3%82%B9%EF%BC%89%E3%82%92%0A%20%20%20%20%E5%9F%BA%E6%BA%96%E3%81%AB%E3%81%97%E3%81%A6%E3%80%81%E6%89%80%E8%A6%81%E6%99%82%E9%96%93%E3%81%8B%E3%82%89%E9%80%86%E7%AE%97%E3%81%97%E3%81%9F%E3%80%8C%E9%85%8D%E5%88%97%E3%82%92%E4%BD%95%E6%9C%AC%E3%81%B6%E3%82%93%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%E3%81%97%E3%81%9F%E3%81%8B%E3%80%8D%E3%81%AE%E6%8E%A8%E5%AE%9A%E5%80%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%B8%AF%E5%9F%9F%E5%BE%8B%E9%80%9F%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E6%99%82%E9%96%93%E3%81%AE%E6%AF%94%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%83%A1%E3%83%A2%E3%83%AA%E5%BE%80%E5%BE%A9%E9%87%8F%E3%81%AE%E6%AF%94%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%9E%8D%E5%90%88%E7%89%88%E3%81%8C%203%20%E3%81%AB%E8%BF%91%E3%81%84%E5%80%A4%E3%81%AB%E3%81%AA%E3%82%8C%E3%81%B0%E3%80%81**%E4%B8%AD%E9%96%93%E9%85%8D%E5%88%97%E3%81%8C%E3%81%99%E3%81%B9%E3%81%A6%E6%B6%88%E3%81%88%E3%81%9F**%E3%81%93%E3%81%A8%E3%81%AE%E8%A3%8F%E4%BB%98%E3%81%91%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20eager%20%E7%89%88%E3%81%AF%E5%BC%8F%E3%82%92%204%20%E3%81%A4%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%B8%E5%88%86%E3%81%91%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E7%B4%A0%E6%9C%B4%E3%81%AB%E6%95%B0%E3%81%88%E3%82%8C%E3%81%B0%2011%E3%80%9C12%20%E3%83%91%E3%82%B9%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%AE%9F%E6%B8%AC%E3%81%8C%E3%81%9D%E3%82%8C%E3%82%88%E3%82%8A%E5%B0%91%E3%81%97%E5%B0%8F%E3%81%95%E3%81%8F%E5%87%BA%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81%E7%9B%B4%E5%89%8D%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%9F%E4%B8%AD%E9%96%93%E9%85%8D%E5%88%97%E3%81%AE%E4%B8%80%E9%83%A8%E3%81%8C%0A%20%20%20%20%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AB%E6%AE%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%81%A6%E3%80%81%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%BE%E3%81%A7%E5%BE%80%E5%BE%A9%E3%81%97%E3%81%AA%E3%81%8F%E3%81%A6%E6%B8%88%E3%82%80%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%AE%9F%E5%8B%99%E4%B8%8A%E3%81%AE%E6%8C%87%E9%87%9D%E3%81%AF%E5%8D%98%E7%B4%94%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82**%E8%A6%81%E7%B4%A0%E3%81%94%E3%81%A8%E3%81%AE%E6%BC%94%E7%AE%97%E3%82%92%E4%B8%A6%E3%81%B9%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%E8%9E%8D%E5%90%88%E3%81%99%E3%82%8B%E3%80%82**%0A%20%20%20%20CuPy%20%E3%81%AA%E3%82%89%20%60cupy.fuse%60%E3%80%81PyTorch%20%E3%81%AA%E3%82%89%20%60torch.compile%60%20%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%82%88%E3%81%8F%E3%80%81%0A%20%20%20%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%89%8B%E3%81%A7%E6%9B%B8%E3%81%8F%E5%BF%85%E8%A6%81%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E6%BC%94%E7%AE%97%E5%BE%8B%E9%80%9F%E3%81%AE%E9%A1%8C%E6%9D%90%EF%BC%9A%E8%A1%8C%E5%88%97%E7%A9%8D%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E9%A1%8C%E6%9D%90%E3%81%AF%E3%81%99%E3%81%B9%E3%81%A6%E5%B8%AF%E5%9F%9F%E5%BE%8B%E9%80%9F%E3%81%A0%E3%81%A3%E3%81%9F%E3%80%82%E4%BB%8A%E5%BA%A6%E3%81%AF%E9%80%86%E3%81%AB%E3%80%81**%E6%BC%94%E7%AE%97%E3%81%8C%E6%94%AF%E9%85%8D%E7%9A%84%E3%81%AA**%E9%A1%8C%E6%9D%90%E3%82%92%E8%A6%8B%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%24N%20%5Ctimes%20N%24%20%E3%81%AE%E8%A1%8C%E5%88%97%E7%A9%8D%E3%81%AF%0A%20%20%20%20%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%BC%94%E7%AE%97%E3%81%8C%20%242N%5E3%24%20%E5%9B%9E%E3%80%81%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%20%243N%5E2%24%20%E8%A6%81%E7%B4%A0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E6%AF%94%E3%82%92%E5%8F%96%E3%82%8B%E3%81%A8%201%20%E8%A6%81%E7%B4%A0%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E6%BC%94%E7%AE%97%E6%95%B0%E3%81%AF%20%24N%24%20%E3%81%AB%E6%AF%94%E4%BE%8B%E3%81%97%E3%81%A6%E5%A2%97%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%A4%E3%81%BE%E3%82%8A%20**%24N%24%20%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%99%E3%82%8B%E3%81%BB%E3%81%A9%E3%80%81%E8%BB%A2%E9%80%81%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%81%8C%E8%A8%88%E7%AE%97%E3%81%AB%E5%9F%8B%E3%82%82%E3%82%8C%E3%82%8B**%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%8C%E3%80%8CGPU%20%E3%81%8C%E5%8A%B9%E3%81%8F%E4%BB%95%E4%BA%8B%E3%80%8D%E3%81%AE%E5%85%B8%E5%9E%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%20NumPy%EF%BC%88%E8%A3%8F%E3%81%A7%20CPU%20%E3%81%AE%20BLAS%20%E3%81%8C%E5%8B%95%E3%81%8D%E3%80%81%E8%A4%87%E6%95%B0%E3%82%B3%E3%82%A2%E3%82%92%E4%BD%BF%E3%81%86%EF%BC%89%E3%81%A8%0A%20%20%20%20%60torch.matmul%60%EF%BC%88%E8%A3%8F%E3%81%A7%20cuBLAS%20%E3%81%8C%E5%8B%95%E3%81%8F%EF%BC%89%E3%80%82%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82**%E8%87%AA%E5%88%86%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84**%E7%82%B9%E3%81%8C%E9%87%8D%E8%A6%81%E3%81%A7%E3%80%81%0A%20%20%20%20%E8%A1%8C%E5%88%97%E7%A9%8D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%AE%9A%E7%95%AA%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AF%E3%80%81%E6%89%8B%E6%9B%B8%E3%81%8D%E3%82%88%E3%82%8A%E5%8D%81%E5%88%86%E3%81%AB%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%91%BC%E3%81%B6%E3%81%BB%E3%81%86%E3%81%8C%E9%80%9F%E3%81%84%E3%80%82%0A%0A%20%20%20%20GPU%20%E5%81%B4%E3%81%AF%20kernel%20%E3%81%AE%E3%81%BF%E3%81%A8%E8%BB%A2%E9%80%81%E8%BE%BC%E3%81%BF%E3%81%AE%E4%B8%A1%E6%96%B9%E3%82%92%E6%B8%AC%E3%82%8B%E3%80%82%0A%20%20%20%20vector%20add%20%E3%81%A7%E3%81%AF%E8%BB%A2%E9%80%81%E8%BE%BC%E3%81%BF%E3%81%8C%20CPU%20%E3%81%AB%E8%B2%A0%E3%81%91%E3%81%9F%E3%81%8C%E3%80%81%E8%A1%8C%E5%88%97%E7%A9%8D%E3%81%A7%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B%E3%81%8B%E3%82%92%E8%A6%8B%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(benchmark%2C%20gpu_ready%2C%20gpu_warm%2C%20np%2C%20pd%2C%20torch)%3A%0A%20%20%20%20MATMUL_SIZES%20%3D%20%5B1024%2C%202048%2C%204096%5D%0A%20%20%20%20matmul_rows%20%3D%20%5B%5D%0A%20%20%20%20matmul_rng%20%3D%20np.random.default_rng(0)%0A%20%20%20%20for%20_size%20in%20MATMUL_SIZES%3A%0A%20%20%20%20%20%20%20%20_flops%20%3D%202%20*%20_size**3%0A%20%20%20%20%20%20%20%20_left%20%3D%20matmul_rng.random((_size%2C%20_size)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20_right%20%3D%20matmul_rng.random((_size%2C%20_size)%2C%20dtype%3Dnp.float32)%0A%0A%20%20%20%20%20%20%20%20def%20_cpu_matmul(a%3D_left%2C%20b%3D_right)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20a%20%40%20b%0A%0A%20%20%20%20%20%20%20%20_cpu%20%3D%20benchmark(f%22numpy%20matmul%20N%3D%7B_size%7D%22%2C%20_cpu_matmul%2C%20repeats%3D3%2C%20warmup_s%3D0.3)%0A%20%20%20%20%20%20%20%20_row%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22N%22%3A%20_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22cpu_ms%22%3A%20_cpu%5B%22min_ms%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22cpu_TFLOPS%22%3A%20_flops%20%2F%20(_cpu%5B%22min_ms%22%5D%20%2F%201e3)%20%2F%201e12%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20gpu_ready%20and%20gpu_warm%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_device_left%20%3D%20torch.from_numpy(_left).cuda()%0A%20%20%20%20%20%20%20%20%20%20%20%20_device_right%20%3D%20torch.from_numpy(_right).cuda()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20def%20_gpu_kernel(a%3D_device_left%2C%20b%3D_device_right)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.matmul(a%2C%20b)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.cuda.synchronize()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20def%20_gpu_with_transfer(a%3D_left%2C%20b%3D_right)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20(torch.from_numpy(a).cuda()%20%40%20torch.from_numpy(b).cuda()).cpu().numpy()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20_kernel%20%3D%20benchmark(f%22cublas%20matmul%20N%3D%7B_size%7D%22%2C%20_gpu_kernel%2C%20repeats%3D3%2C%20warmup_s%3D0.3)%0A%20%20%20%20%20%20%20%20%20%20%20%20_transfer%20%3D%20benchmark(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22cublas%20matmul%20%2Btransfer%20N%3D%7B_size%7D%22%2C%20_gpu_with_transfer%2C%20repeats%3D3%2C%20warmup_s%3D0.3%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20_row.update(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22gpu_kernel_ms%22%3A%20_kernel%5B%22min_ms%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22gpu_kernel_TFLOPS%22%3A%20_flops%20%2F%20(_kernel%5B%22min_ms%22%5D%20%2F%201e3)%20%2F%201e12%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22gpu_transfer_ms%22%3A%20_transfer%5B%22min_ms%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22speedup_kernel%22%3A%20_cpu%5B%22min_ms%22%5D%20%2F%20_kernel%5B%22min_ms%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22speedup_with_transfer%22%3A%20_cpu%5B%22min_ms%22%5D%20%2F%20_transfer%5B%22min_ms%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20del%20_device_left%2C%20_device_right%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.cuda.empty_cache()%0A%20%20%20%20%20%20%20%20matmul_rows.append(_row)%0A%20%20%20%20pd.DataFrame(matmul_rows).round(2)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20vector%20add%20%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%81%8C%E3%81%AF%E3%81%A3%E3%81%8D%E3%82%8A%E5%87%BA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%7C%20%E9%A1%8C%E6%9D%90%20%7C%201%20%E8%A6%81%E7%B4%A0%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E6%BC%94%E7%AE%97%20%7C%20kernel%20%E3%81%AE%E3%81%BF%20%7C%20%E8%BB%A2%E9%80%81%E8%BE%BC%E3%81%BF%20%7C%0A%20%20%20%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%0A%20%20%20%20%7C%20vector%20add%20%7C%20%E5%AE%9A%E6%95%B0%EF%BC%881%2F12%20FLOP%2Fbyte%EF%BC%89%20%7C%20GPU%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E5%8B%9D%E3%81%A4%20%7C%20**GPU%20%E3%81%8C%E8%B2%A0%E3%81%91%E3%82%8B**%20%7C%0A%20%20%20%20%7C%20%E8%A1%8C%E5%88%97%E7%A9%8D%20%7C%20%24N%24%20%E3%81%AB%E6%AF%94%E4%BE%8B%E3%81%97%E3%81%A6%E5%A2%97%E3%81%88%E3%82%8B%20%7C%20GPU%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E5%8B%9D%E3%81%A4%20%7C%20**GPU%20%E3%81%8C%E5%8B%9D%E3%81%A4**%20%7C%0A%0A%20%20%20%20%E5%90%8C%E3%81%98%20GPU%E3%80%81%E5%90%8C%E3%81%98%E8%BB%A2%E9%80%81%E7%B5%8C%E8%B7%AF%E3%81%A7%E3%82%82%E3%80%81**%E9%A1%8C%E6%9D%90%E3%81%AE%E6%BC%94%E7%AE%97%E5%BC%B7%E5%BA%A6%E3%81%8C%E7%B5%90%E8%AB%96%E3%82%92%E5%8F%8D%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B**%E3%80%82%0A%20%20%20%20%E3%80%8CGPU%20%E3%81%AF%E9%80%9F%E3%81%84%EF%BC%8F%E9%81%85%E3%81%84%E3%80%8D%E3%81%A8%E4%B8%80%E8%88%AC%E5%8C%96%E3%81%A7%E3%81%8D%E3%81%9A%E3%80%81%0A%20%20%20%20%E8%BB%A2%E9%80%81%E9%87%8F%E3%81%82%E3%81%9F%E3%82%8A%E3%81%A9%E3%82%8C%E3%81%A0%E3%81%91%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%81%8B%E3%81%A7%E5%88%A4%E6%96%AD%E3%81%99%E3%82%8B%E3%81%97%E3%81%8B%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20%E3%81%9F%E3%81%A0%E3%81%97%20%60speedup_with_transfer%60%20%E3%81%AE%E5%88%97%E3%81%AF%E3%80%81%24N%24%20%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E7%B4%A0%E7%9B%B4%E3%81%AB%E3%81%AF%E4%BC%B8%E3%81%B3%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E7%90%86%E8%AB%96%E3%81%A0%E3%81%91%E3%82%92%E8%A6%8B%E3%82%8C%E3%81%B0%E8%A8%88%E7%AE%97%E3%81%8C%20%24N%5E3%24%E3%80%81%E8%BB%A2%E9%80%81%E3%81%8C%20%24N%5E2%24%20%E3%81%AA%E3%81%AE%E3%81%A7%20%24N%24%20%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E4%B8%80%E6%96%B9%E7%9A%84%E3%81%AB%E6%9C%89%E5%88%A9%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AF%E3%81%9A%E3%81%A0%E3%81%8C%E3%80%81%0A%20%20%20%20%E5%AE%9F%E6%B8%AC%E3%81%AF%E9%80%94%E4%B8%AD%E3%81%A7%E9%A0%AD%E6%89%93%E3%81%A1%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E5%A4%A7%E3%81%8D%E3%81%84%20%24N%24%20%E3%81%A7%E3%81%AF%E4%B8%8B%E3%81%8C%E3%82%8B%E3%80%822%20%E3%81%A4%E3%81%AE%E8%A6%81%E5%9B%A0%E3%81%8C%E7%B5%A1%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60cpu_TFLOPS%60%20%E5%88%97%E3%81%AE%E3%81%A8%E3%81%8A%E3%82%8A%E3%80%81CPU%20%E5%81%B4%E3%82%82%20%24N%24%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%BB%E3%81%A9%E5%8A%B9%E7%8E%87%E3%81%8C%E4%B8%8A%E3%81%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E6%AF%94%E8%BC%83%E7%9B%B8%E6%89%8B%E3%81%8C%E5%BC%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81GPU%20%E3%81%AE%E5%84%AA%E4%BD%8D%E3%81%AF%E3%81%9D%E3%81%AE%E5%88%86%E3%81%A0%E3%81%91%E5%89%8A%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%60gpu_transfer_ms%60%20%E3%81%AE%E4%BC%B8%E3%81%B3%E3%81%8C%E3%80%81%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E5%A4%A7%E3%81%8D%E3%81%84%20%24N%24%20%E3%81%A7%20%24N%5E2%24%20%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E8%B6%85%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E3%81%93%E3%81%AE%E8%BB%A2%E9%80%81%E3%81%AF%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%9B%E3%82%B9%E3%83%88%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E6%AF%8E%E5%9B%9E%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%97%E7%9B%B4%E3%81%99%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%20%20%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%A8%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%81%A8%E5%86%8D%E7%A2%BA%E4%BF%9D%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%81%8C%E5%8A%B9%E3%81%84%E3%81%A6%E3%81%8F%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%BB%A2%E9%80%81%E3%82%92%E6%9C%AC%E6%B0%97%E3%81%A7%E9%80%9F%E3%81%8F%E3%81%99%E3%82%8B%E3%81%AA%E3%82%89%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%AD%E3%83%83%E3%82%AF%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A8%E7%A2%BA%E4%BF%9D%E3%81%AE%E4%BD%BF%E3%81%84%E5%9B%9E%E3%81%97%E3%81%8C%E8%A6%81%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82**%E8%A1%8C%E5%88%97%E7%A9%8D%E3%81%A7%E3%81%AF%E3%80%81%E3%81%A9%E3%81%AE%20%24N%24%20%E3%81%A7%E3%82%82%E8%BB%A2%E9%80%81%E3%82%92%E5%90%AB%E3%82%81%E3%81%A6%20GPU%20%E3%81%8C%E5%8B%9D%E3%81%A4**%E3%81%A8%E3%81%84%E3%81%86%E7%B5%90%E8%AB%96%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20%E3%82%82%E3%81%86%201%20%E3%81%A4%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81%60cpu_TFLOPS%60%20%E3%81%A8%20%60gpu_kernel_TFLOPS%60%20%E3%81%AE%E5%B7%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%E4%BA%BA%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%9F%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81BLAS%20%E3%81%A8%20cuBLAS%20%E3%81%A8%E3%81%84%E3%81%86%0A%20%20%20%20%E9%AB%98%E5%BA%A6%E3%81%AB%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E6%95%B0%E5%AD%97%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%A1%8C%E5%88%97%E7%A9%8D%E3%83%BBFFT%E3%83%BB%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%AE%9A%E7%95%AA%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20**%E8%87%AA%E5%88%86%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E6%9C%80%E3%82%82%E5%8A%B9%E3%81%8F%E6%9C%80%E9%81%A9%E5%8C%96**%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%81%A7%E8%A6%8B%E3%81%A6%E3%81%8D%E3%81%9F%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AF%E3%80%81%0A%20%20%20%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E7%84%A1%E3%81%84%E6%BC%94%E7%AE%97%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AE%E6%89%8B%E6%AE%B5%E3%81%A0%E3%81%A8%E4%BD%8D%E7%BD%AE%E3%81%A5%E3%81%91%E3%82%8B%E3%81%AE%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%AE%E6%8C%87%E9%87%9D%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E5%AE%9F%E6%B8%AC%E3%82%92%E3%82%82%E3%81%A8%E3%81%AB%E3%80%81GPU%20%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%88%A4%E6%96%AD%E3%82%92%E4%B8%8A%E3%81%8B%E3%82%89%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E3%82%8B%E3%80%82%0A%20%20%20%20**%E4%B8%8A%E3%81%AB%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE%E3%81%BB%E3%81%A9%E5%8A%B9%E6%9E%9C%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%80%82**%20%E4%B8%8B%E3%81%B8%E8%A1%8C%E3%81%8F%E3%81%BB%E3%81%A9%E5%B7%AE%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20**1.%20%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%20GPU%20%E3%81%B8%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8F%E3%81%8B%E3%80%82**%20%E6%B1%BA%E3%82%81%E6%89%8B%E3%81%AF%E6%BC%94%E7%AE%97%E5%BC%B7%E5%BA%A6%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20vector%20add%EF%BC%881%20FLOP%20%E3%81%82%E3%81%9F%E3%82%8A%2012%20%E3%83%90%E3%82%A4%E3%83%88%E3%81%AE%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%EF%BC%89%E3%81%AF%E3%80%81%E6%AF%8E%E5%9B%9E%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%97%E3%81%A6%0A%20%20%20%20%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%9B%E3%82%B9%E3%83%88%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8B%E3%82%89%E5%BE%80%E5%BE%A9%E3%81%95%E3%81%9B%E3%82%8B%E3%81%A8%20CPU%20%E3%81%AB%E8%B2%A0%E3%81%91%E3%81%9F%E3%80%82%0A%20%20%20%20%E8%A1%8C%E5%88%97%E7%A9%8D%EF%BC%88%E8%A8%88%E7%AE%97%E3%81%8C%20%24N%5E3%24%E3%80%81%E8%BB%A2%E9%80%81%E3%81%8C%20%24N%5E2%24%EF%BC%89%E3%81%AF%E3%80%81%E5%90%8C%E3%81%98%E5%BE%80%E5%BE%A9%E3%82%92%E3%81%97%E3%81%A6%E3%82%82%E5%8B%9D%E3%81%A3%E3%81%9F%E3%80%82%0A%20%20%20%20%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%20GPU%20%E4%B8%8A%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%9F%E3%81%BE%E3%81%BE%E8%A4%87%E6%95%B0%E3%81%AE%E6%BC%94%E7%AE%97%E3%82%92%E9%87%8D%E3%81%AD%E3%82%89%E3%82%8C%E3%82%8B%E3%81%AA%E3%82%89%20GPU%20%E3%81%8C%E5%8A%B9%E3%81%8F%E3%80%82%0A%20%20%20%201%20%E5%9B%9E%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E5%BE%80%E5%BE%A9%E3%81%95%E3%81%9B%E3%82%8B%E3%81%AA%E3%82%89%E3%80%81%E3%81%9F%E3%81%84%E3%81%A6%E3%81%84%E5%89%B2%E3%81%AB%E5%90%88%E3%82%8F%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20**2.%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AA%E3%82%89%E8%87%AA%E5%88%86%E3%81%A7%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%E3%80%82**%20%E8%A1%8C%E5%88%97%E7%A9%8D%E3%83%BBFFT%E3%83%BB%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%0A%20%20%20%20%E5%AE%9A%E7%95%AA%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AF%20cuBLAS%20%E3%82%84%20cuFFT%20%E3%81%8C%E6%8B%85%E5%BD%93%E3%81%99%E3%82%8B%E3%80%82%E5%AE%9F%E6%B8%AC%E3%81%A7%E3%82%82%20cuBLAS%20%E3%81%AF%2012%20TFLOP%2Fs%20%E5%8F%B0%E3%81%AB%E9%81%94%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%E6%89%8B%E6%9B%B8%E3%81%8D%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%A7%E3%81%93%E3%82%8C%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%AE%E3%81%AF%E7%8F%BE%E5%AE%9F%E7%9A%84%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20**3.%20%E8%A6%81%E7%B4%A0%E3%81%94%E3%81%A8%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AF%E8%9E%8D%E5%90%88%E3%81%99%E3%82%8B%E3%80%82**%20%60cupy.fuse%60%20%E3%82%84%20%60torch.compile%60%20%E3%82%92%0A%20%20%20%20%E4%BB%98%E3%81%91%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%203%20%E5%80%8D%E5%89%8D%E5%BE%8C%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%80%82%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E6%89%8B%E3%81%A7%E6%9B%B8%E3%81%8F%E5%89%8D%E3%81%AB%E3%80%81%E3%81%BE%E3%81%9A%E3%81%93%E3%82%8C%E3%82%92%E8%A9%A6%E3%81%99%E3%80%82%0A%0A%20%20%20%20**4.%20%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E6%9B%B8%E3%81%8F%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AA%E3%82%89%E3%80%81%E9%80%9F%E5%BA%A6%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E7%8A%B6%E6%B3%81%E3%81%A7%E9%81%B8%E3%81%B6%E3%80%82**%0A%20%20%20%20kernel%20%E3%81%AE%E5%AE%9F%E6%B8%AC%E3%81%AF%206%20%E6%96%B9%E5%BC%8F%E3%81%A8%E3%82%82%200.55%E3%80%9C0.63%20ms%20%E3%81%A7%E6%A8%AA%E4%B8%A6%E3%81%B3%E3%81%A0%E3%81%A3%E3%81%9F%E3%80%82%E5%B8%AF%E5%9F%9F%E5%BE%8B%E9%80%9F%E3%81%A0%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E9%80%9F%E5%BA%A6%E3%81%A7%E5%B7%AE%E3%81%8C%E4%BB%98%E3%81%8B%E3%81%AA%E3%81%84%E3%81%AA%E3%82%89%E3%80%81%E6%97%A2%E5%AD%98%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%81%AE%E7%9B%B8%E6%80%A7%E3%81%A8%E4%BE%9D%E5%AD%98%E3%81%AE%E9%87%8D%E3%81%95%E3%81%A7%E6%B1%BA%E3%82%81%E3%81%A6%E3%82%88%E3%81%84%E3%80%82%0A%0A%20%20%20%20%7C%20%E7%8A%B6%E6%B3%81%20%7C%20%E6%96%B9%E5%BC%8F%20%7C%20%E7%90%86%E7%94%B1%20%7C%0A%20%20%20%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%0A%20%20%20%20%7C%20%E3%81%99%E3%81%A7%E3%81%AB%20PyTorch%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%20%7C%20PyTorch%E3%80%81%E8%B6%B3%E3%82%8A%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20%60torch.compile%60%E3%80%81%E3%81%95%E3%82%89%E3%81%AB%20Triton%20%7C%20%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%B8%A1%E3%81%9B%E3%82%8B%E3%80%82Triton%20%E3%82%82%20torch%20%E3%81%AE%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B%20%7C%0A%20%20%20%20%7C%20NumPy%20%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%20GPU%20%E3%81%B8%E7%A7%BB%E3%81%99%20%7C%20CuPy%20%7C%20API%20%E3%81%8C%E3%81%BB%E3%81%BC%E5%90%8C%E3%81%98%E3%81%A7%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%8C%E6%9C%80%E5%B0%8F%20%7C%0A%20%20%20%20%7C%20Python%20%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E7%A7%BB%E3%81%97%E3%81%9F%E3%81%84%20%7C%20numba-cuda%20%7C%201%20%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%88%86%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%20Python%20%E3%81%A7%E6%9B%B8%E3%81%91%E3%82%8B%20%7C%0A%20%20%20%20%7C%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%8D%98%E4%BD%8D%E3%81%A7%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%97%E3%81%9F%E3%81%84%20%7C%20Triton%20%7C%20%E3%82%BF%E3%82%A4%E3%83%AB%E5%88%86%E5%89%B2%E3%81%A8%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%8C%96%E3%82%92%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AB%E4%BB%BB%E3%81%9B%E3%82%89%E3%82%8C%E3%82%8B%20%7C%0A%20%20%20%20%7C%20%E6%97%A2%E5%AD%98%E3%81%AE%20CUDA%20C%2B%2B%20%E8%B3%87%E7%94%A3%E3%81%8C%E3%81%82%E3%82%8B%20%7C%20CuPy%20RawKernel%20%7C%20%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E6%B8%A1%E3%81%99%E3%81%A0%E3%81%91%20%7C%0A%20%20%20%20%7C%20%E4%BE%9D%E5%AD%98%E3%82%92%E6%9C%80%E5%B0%8F%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84%E3%80%81%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%20API%20%E3%82%92%E7%9B%B4%E6%8E%A5%E5%8F%A9%E3%81%8D%E3%81%9F%E3%81%84%20%7C%20cuda-python%20%7C%20%E6%9C%80%E3%82%82%E4%BD%8E%E6%B0%B4%E6%BA%96%E3%80%82%E5%AE%9A%E5%9E%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E5%A2%97%E3%81%88%E3%82%8B%20%7C%0A%0A%20%20%20%20**5.%20%E8%BB%A2%E9%80%81%E3%81%AF%E4%BD%BF%E3%81%84%E5%9B%9E%E3%81%97%E3%81%A8%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%E5%8A%B9%E3%81%8F%E3%80%82**%20%60%2Btransfer%60%20%E3%81%AE%E5%AE%9F%E6%B8%AC%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20%E7%A2%BA%E4%BF%9D%E6%B8%88%E3%81%BF%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%AD%E3%83%83%E3%82%AF%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%86%20cuda-python%20%E3%81%8C%201%20%E6%A1%81%20ms%20%E5%8F%B0%E3%81%A7%E3%80%81%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%E3%81%AF%20vector%20add%20%E3%81%A7%E3%82%82%20CPU%20%E3%82%92%E4%B8%8A%E5%9B%9E%E3%81%A3%E3%81%9F%E3%80%82%0A%20%20%20%20%E6%AF%8E%E5%9B%9E%E7%A2%BA%E4%BF%9D%E3%81%97%E3%81%A6%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B%E4%BB%96%E3%81%AE%E6%96%B9%E5%BC%8F%E3%81%AF%E6%95%B0%E5%8D%81%20ms%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%90%8C%E3%81%98%20PCIe%20%E3%82%92%E9%80%9A%E3%81%A3%E3%81%A6%E3%81%84%E3%81%A6%E3%82%82%E3%81%93%E3%82%8C%E3%81%A0%E3%81%91%E5%A4%89%E3%82%8F%E3%82%8B%E3%80%82%0A%0A%20%20%20%20**6.%20%60multiprocessing%60%20%E3%81%A8%E4%BD%B5%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AA%E3%82%89%E9%A0%86%E7%95%AA%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%99%E3%82%8B%E3%80%82**%0A%20%20%20%20CUDA%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%81%82%E3%81%A8%E3%81%AF%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E7%94%9F%E6%88%90%E3%81%8C%E9%87%8D%E3%81%8F%E3%81%AA%E3%82%8B%E3%80%82%E6%AC%A1%E7%AB%A0%E3%81%A7%E5%AE%9F%E6%B8%AC%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%9C%80%E5%BE%8C%E3%81%AB%E3%80%81%E4%BE%9D%E5%AD%98%E3%81%AE%E9%87%8D%E3%81%95%E3%82%92%E5%AE%9F%E9%9A%9B%E3%81%AB%E6%B8%AC%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%80%82%0A%20%20%20%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%201%20%E3%81%A4%E6%9B%B8%E3%81%8D%E3%81%9F%E3%81%84%E3%81%A0%E3%81%91%E3%81%AA%E3%81%AE%E3%81%8B%E3%80%81%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%9B%A4%E3%81%94%E3%81%A8%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%8B%E3%81%A7%E3%80%81%0A%20%20%20%20%E7%8F%BE%E5%AE%9F%E7%9A%84%E3%81%AA%E9%81%B8%E6%8A%9E%E8%82%A2%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%8B%E3%80%82%60importlib.metadata%60%20%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%B0%8E%E5%85%A5%E6%B8%88%E3%81%BF%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%90%88%E8%A8%88%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(pd)%3A%0A%20%20%20%20import%20re%0A%20%20%20%20from%20importlib.metadata%20import%20PackageNotFoundError%2C%20distribution%2C%20distributions%0A%0A%20%20%20%20def%20distribution_mib(name)%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20dist%20%3D%20distribution(name)%0A%20%20%20%20%20%20%20%20except%20PackageNotFoundError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20if%20not%20dist.files%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20total%20%3D%200%0A%20%20%20%20%20%20%20%20for%20entry%20in%20dist.files%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%2B%3D%20dist.locate_file(entry).stat().st_size%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20OSError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20return%20total%20%2F%202**20%0A%0A%20%20%20%20def%20group_mib(names)%3A%0A%20%20%20%20%20%20%20%20found%20%3D%20%5Bsize%20for%20size%20in%20map(distribution_mib%2C%20names)%20if%20size%20is%20not%20None%5D%0A%20%20%20%20%20%20%20%20return%20sum(found)%20if%20found%20else%20float(%22nan%22)%0A%0A%20%20%20%20footprint_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22backend%22%3A%20%22cuda-python%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22packages%22%3A%20%22cuda-python%2C%20cuda-bindings%2C%20cuda-core%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20group_mib(%5B%22cuda-python%22%2C%20%22cuda-bindings%22%2C%20%22cuda-core%22%5D)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22backend%22%3A%20%22CuPy%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22packages%22%3A%20%22cupy-cuda13x%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20group_mib(%5B%22cupy-cuda13x%22%5D)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22backend%22%3A%20%22numba-cuda%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22packages%22%3A%20%22numba%2C%20numba-cuda%2C%20llvmlite%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20group_mib(%5B%22numba%22%2C%20%22numba-cuda%22%2C%20%22llvmlite%22%5D)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22backend%22%3A%20%22Triton%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22packages%22%3A%20%22triton%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20group_mib(%5B%22triton%22%5D)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22backend%22%3A%20%22PyTorch%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22packages%22%3A%20%22torch%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20group_mib(%5B%22torch%22%5D)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20nvidia_direct_of_torch%20%3D%20set()%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20for%20_requirement%20in%20distribution(%22torch%22).requires%20or%20%5B%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_required%20%3D%20re.split(r%22%5B%3C%3E%3D!~%5C%5B%5Cs%3B%5D%22%2C%20_requirement.strip()%2C%20maxsplit%3D1)%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20nvidia_direct_of_torch.add(_required.replace(%22_%22%2C%20%22-%22).lower())%0A%20%20%20%20except%20PackageNotFoundError%3A%0A%20%20%20%20%20%20%20%20pass%0A%0A%20%20%20%20torch_extra%2C%20cuda_common%20%3D%200.0%2C%200.0%0A%20%20%20%20for%20_dist%20in%20distributions()%3A%0A%20%20%20%20%20%20%20%20_name%20%3D%20_dist.metadata%5B%22Name%22%5D%20or%20%22%22%0A%20%20%20%20%20%20%20%20if%20not%20_name.replace(%22_%22%2C%20%22-%22).lower().startswith(%22nvidia-%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20_size%20%3D%20distribution_mib(_name)%0A%20%20%20%20%20%20%20%20if%20_size%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20if%20_name.replace(%22_%22%2C%20%22-%22).lower()%20in%20nvidia_direct_of_torch%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20torch_extra%20%2B%3D%20_size%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cuda_common%20%2B%3D%20_size%0A%20%20%20%20footprint_rows.append(%7B%0A%20%20%20%20%20%20%20%20%22backend%22%3A%20%22CUDA%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%20(cuda-toolkit%20%E7%B5%8C%E7%94%B1)%22%2C%0A%20%20%20%20%20%20%20%20%22packages%22%3A%20%22nvidia-*%20(cuda-python%20%2F%20numba-cuda%20%2F%20torch%20%E3%81%8C%E5%85%B1%E6%9C%89)%22%2C%0A%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20cuda_common%2C%0A%20%20%20%20%7D)%0A%20%20%20%20footprint_rows.append(%7B%0A%20%20%20%20%20%20%20%20%22backend%22%3A%20%22PyTorch%20%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%A7%E5%BC%95%E3%81%8D%E8%BE%BC%E3%82%80%E5%88%86%22%2C%0A%20%20%20%20%20%20%20%20%22packages%22%3A%20%22nvidia-cudnn%20%2F%20nccl%20%2F%20cusparselt%20%2F%20nvshmem%22%2C%0A%20%20%20%20%20%20%20%20%22installed_MiB%22%3A%20torch_extra%2C%0A%20%20%20%20%7D)%0A%20%20%20%20pd.DataFrame(footprint_rows).round(1)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E4%B8%8A%E3%81%AE%205%20%E8%A1%8C%E3%81%AF%E5%90%84%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E8%87%AA%E8%BA%AB%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A0%E3%81%91%E3%82%92%E6%95%B0%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%B7%AE%E3%81%AF%E6%98%8E%E7%A2%BA%E3%81%A7%E3%80%81**PyTorch%20%E3%81%A8%20Triton%20%E3%81%8C%E9%A3%9B%E3%81%B3%E6%8A%9C%E3%81%91%E3%81%A6%E5%A4%A7%E3%81%8D%E3%81%8F%E3%80%81CuPy%20%E3%81%A8%20numba-cuda%20%E3%81%8C%E4%B8%AD%E7%A8%8B%E5%BA%A6%E3%80%81%0A%20%20%20%20cuda-python%20%E3%81%8C%E6%9C%80%E3%82%82%E8%BB%BD%E3%81%84**%E3%80%82%0A%0A%20%20%20%20%E4%B8%8B%E3%81%AE%202%20%E8%A1%8C%E3%81%AF%20CUDA%20%E6%9C%AC%E4%BD%93%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%81%93%E3%81%AE%202%20%E8%A1%8C%E3%81%AF%E5%88%86%E3%81%91%E3%81%A6%E8%AA%AD%E3%82%80%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20**%60cuda-toolkit%60%20%E7%B5%8C%E7%94%B1%E3%81%AE%E5%88%86%E3%81%AF%E5%85%B1%E6%9C%89%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82**%20%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BE%BF%E3%82%8B%E3%81%A8%E3%80%81%0A%20%20%20%20%20%20%60cuda-toolkit%60%20%E3%82%92%E8%A6%81%E6%B1%82%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%20%60cuda-bindings%60%E3%83%BB%60numba-cuda%60%E3%83%BB%60torch%60%20%E3%81%AE%203%20%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E3%81%A4%E3%81%BE%E3%82%8A%20cuda-python%20%E3%82%82%20numba-cuda%20%E3%82%82%E3%80%81%E7%B5%90%E5%B1%80%E3%81%AF%E5%90%8C%E3%81%98%20CUDA%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%BE%A4%E3%82%92%E5%BC%95%E3%81%8D%E8%BE%BC%E3%82%80%E3%80%82%0A%20%20%20%20%20%20%E6%9C%AC%E4%BD%93%E3%81%8C%E8%BB%BD%E3%81%84%E3%81%8B%E3%82%89%E3%81%A8%E3%81%84%E3%81%A3%E3%81%A6%E3%80%81%E5%85%A8%E4%BD%93%E3%81%8C%E8%BB%BD%E3%81%8F%E3%81%AA%E3%82%8B%E3%82%8F%E3%81%91%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20-%20**PyTorch%20%E3%81%AF%E3%81%95%E3%82%89%E3%81%AB%20cuDNN%E3%83%BBNCCL%E3%83%BBcuSPARSELt%E3%83%BBNVSHMEM%20%E3%82%92%E8%B6%B3%E3%81%99%E3%80%82**%0A%20%20%20%20%20%20%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%201%20%E3%81%A4%E6%9B%B8%E3%81%8D%E3%81%9F%E3%81%84%E3%81%A0%E3%81%91%E3%81%AA%E3%82%89%E4%B8%8D%E8%A6%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E4%BE%8B%E5%A4%96%E3%81%AF%20CuPy%20%E3%81%A7%E3%80%81**%60cupy-cuda13x%60%20%E3%81%AE%E4%BE%9D%E5%AD%98%E3%81%AF%20%60numpy%60%20%E3%81%A8%20%60fastrlock%60%20%E3%81%A0%E3%81%91**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20CUDA%20%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AF%20wheel%20%E3%81%8C%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%80%82%0A%20%20%20%20NumPy%20%E4%BA%92%E6%8F%9B%E3%81%AE%20API%20%E3%81%A7%E6%9B%B8%E3%81%91%E3%81%A6%E8%BF%BD%E5%8A%A0%E3%81%AE%E4%BE%9D%E5%AD%98%E3%82%82%E8%BB%BD%E3%81%84%E3%80%81%E3%81%A8%E3%81%84%E3%81%86%E7%82%B9%E3%81%AF%E3%81%93%E3%81%AE%E8%A1%A8%E3%81%8B%E3%82%89%E3%82%82%E8%A3%8F%E3%81%A5%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20numba-cuda%20%E3%81%AE%20194%20MiB%20%E3%81%AE%E3%81%86%E3%81%A1%E7%B4%84%20171%20MiB%20%E3%81%AF%20%60llvmlite%60%EF%BC%88LLVM%20%E3%81%AE%20Python%20%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%EF%BC%89%E3%81%A7%E3%80%81%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%20CPU%20%E5%81%B4%E3%81%A7%20%60%40njit%60%20%E3%82%92%E4%BD%BF%E3%81%86%E6%99%82%E7%82%B9%E3%81%A7%E5%85%A5%E3%82%8B%E3%80%82%0A%20%20%20%20Numba%20%E3%82%92%E6%97%A2%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AA%E3%82%89%E3%80%81GPU%20%E3%81%B8%E5%BA%83%E3%81%92%E3%82%8B%E8%BF%BD%E5%8A%A0%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%84%E3%80%82%0A%0A%20%20%20%20Triton%20%E3%81%AF%20%60torch%60%20%E3%81%AE%E4%BE%9D%E5%AD%98%E3%81%A8%E3%81%97%E3%81%A6%E5%85%A5%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81PyTorch%20%E3%82%92%E4%BD%BF%E3%81%86%E7%92%B0%E5%A2%83%E3%81%AA%E3%82%89%E8%BF%BD%E5%8A%A0%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E9%80%86%E3%81%AB%E3%80%81GPU%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%201%20%E3%81%A4%E6%9B%B8%E3%81%8D%E3%81%9F%E3%81%84%E3%81%A0%E3%81%91%E3%81%AE%E7%94%A8%E9%80%94%E3%81%A7%20PyTorch%20%E3%82%92%E4%B8%B8%E3%81%94%E3%81%A8%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%AF%E3%80%81%0A%20%20%20%20%E5%88%A4%E6%96%AD%E3%81%AE%E5%88%86%E3%81%8B%E3%82%8C%E7%9B%AE%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4%EF%BC%9Afork%20%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AF%E8%A6%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%95%E3%81%A7%E6%B1%BA%E3%81%BE%E3%82%8B%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86%E3%81%AE%E7%AF%80%E3%81%B8%E6%88%BB%E3%82%8B%E3%80%82%E3%81%82%E3%81%AE%E7%AF%80%E3%81%A7%E3%81%AF%E3%80%81%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%92%208%20%E3%81%AB%E5%A2%97%E3%82%84%E3%81%97%E3%81%A6%E3%82%82%0A%20%20%20%20%E9%80%9F%E5%BA%A6%E3%81%8C%E9%A0%AD%E6%89%93%E3%81%A1%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%80%826%20%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%97%E3%81%8B%E7%84%A1%E3%81%84%E3%81%93%E3%81%A8%E3%81%AB%E5%8A%A0%E3%81%88%E3%81%A6%E3%80%81%0A%20%20%20%20**%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E7%94%9F%E6%88%90%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%8C%E9%87%8D%E3%81%84**%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E7%AF%80%E3%82%92%20GPU%20%E3%81%AE%E5%BE%8C%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81**%E5%90%8C%E3%81%98%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A7%20GPU%20%E3%82%92%E4%BD%BF%E3%81%86%E5%89%8D%E3%81%A8%E5%BE%8C%E3%82%92%0A%20%20%20%20%E6%AF%94%E3%81%B9%E3%81%9F%E3%81%84**%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86%E3%81%AE%E7%AF%80%E3%81%A7%E3%81%AF%20GPU%20%E3%81%AB%E4%B8%80%E5%BA%A6%E3%82%82%E8%A7%A6%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%81%A7%E6%B8%AC%E3%82%8A%E3%80%81%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%80%9A%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%A7%E6%B8%AC%E3%82%8A%E7%9B%B4%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60fork%60%20%E3%81%AF%E8%A6%AA%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E3%82%92%E5%AD%90%E3%81%B8%E5%BC%95%E3%81%8D%E7%B6%99%E3%81%90%E3%80%82%E5%AE%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E3%82%B3%E3%83%94%E3%83%BC%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%88%E3%81%A7%E5%85%B1%E6%9C%89%E3%81%95%E3%82%8C%E3%82%8B%E3%81%8C%E3%80%81%0A%20%20%20%20%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E8%A4%87%E8%A3%BD%E3%81%A8%E5%90%84%E7%A8%AE%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E5%BE%8C%E5%87%A6%E7%90%86%E3%81%AF%E8%A6%AA%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%95%E3%81%AB%E6%AF%94%E4%BE%8B%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E8%A6%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AF%20torch%E3%83%BBCuPy%E3%83%BBdask%E3%83%BBpandas%20%E3%81%AA%E3%81%A9%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E4%BB%95%E4%BA%8B%E3%82%92%E3%81%97%E3%81%AA%E3%81%84%E7%A9%BA%E3%81%AE%E3%83%97%E3%83%BC%E3%83%AB%E3%82%92%E8%B5%B7%E3%81%93%E3%81%97%E3%81%A6%E7%95%B3%E3%82%80%E3%81%A0%E3%81%91%E3%81%A7%E3%82%82%E7%84%A1%E8%A6%96%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%206%20%E3%81%A4%E3%81%AE%E6%9D%A1%E4%BB%B6%E3%82%92%E6%B8%AC%E3%82%8B%E3%80%821%20%E3%81%8B%E3%82%89%204%20%E3%81%AF%E5%88%A5%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E7%AB%8B%E3%81%A6%E3%81%A6%201%20%E3%81%A4%E3%81%9A%E3%81%A4%E6%9D%A1%E4%BB%B6%E3%82%92%E7%A9%8D%E3%81%BF%E4%B8%8A%E3%81%92%E3%80%81%0A%20%20%20%205%20%E3%81%A8%206%20%E3%81%AF%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E8%87%AA%E8%BA%AB%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A7%E6%B8%AC%E3%82%8B%E3%80%82%0A%0A%20%20%20%201.%20%E4%BD%95%E3%82%82%20import%20%E3%81%97%E3%81%AA%E3%81%84%E6%9C%80%E5%B0%8F%E3%81%AE%20Python%0A%20%20%20%202.%20torch%20%E3%82%92%20import%20%E3%81%97%E3%81%9F%E3%81%A0%E3%81%91%0A%20%20%20%203.%20%E3%81%95%E3%82%89%E3%81%AB%20CuPy%E3%83%BBdask%E3%83%BBpandas%20%E3%82%82%20import%0A%20%20%20%204.%20%E3%81%95%E3%82%89%E3%81%AB%20GPU%20%E4%B8%8A%E3%81%AB%E9%85%8D%E5%88%97%E3%82%92%201%20%E3%81%A4%E4%BD%9C%E3%81%A3%E3%81%A6%20CUDA%20%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%AE%9F%E9%9A%9B%E3%81%AB%E7%94%9F%E6%88%90%0A%20%20%20%205.%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%80%81GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%88%E3%82%8A%E5%89%8D%0A%20%20%20%206.%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%80%81GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%80%9A%E3%81%97%E3%81%9F%E5%BE%8C%0A%0A%20%20%20%204%20%E3%81%A7%20%60torch.cuda.is_available()%60%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20%60torch.zeros(1%2C%20device%3D%22cuda%22)%60%20%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%AF%E3%80%81%0A%20%20%20%20**%60is_available()%60%20%E3%81%AF%20CUDA%20%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%97%E3%81%AA%E3%81%84%E3%81%8B%E3%82%89**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82PyTorch%20%E3%81%AF%E3%81%93%E3%81%AE%E5%88%A4%E5%AE%9A%E3%82%92%20NVML%20%E3%81%A7%0A%20%20%20%20%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%80%81%E5%91%BC%E3%82%93%E3%81%A7%E3%82%82%20%60torch.cuda.is_initialized()%60%20%E3%81%AF%20%60False%60%20%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%82%88%E3%81%8F%E3%80%8CCUDA%20%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%97%E3%81%9F%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8B%E3%82%89%20fork%20%E3%81%99%E3%82%8B%E3%81%AA%E3%80%8D%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E3%80%82%E5%AD%90%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E4%B8%AD%E3%81%A7%0A%20%20%20%20CUDA%20%E3%82%92%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%AF%E5%B8%B8%E3%81%AB%E6%88%90%E3%82%8A%E7%AB%8B%E3%81%A4%E5%88%B6%E7%B4%84%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%81%97%E3%81%8B%E3%81%97**%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E9%9D%A2%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%203%20%E3%81%A8%204%20%E3%81%AE%E5%B7%AE%E3%81%AF%201%20%E3%81%8B%E3%82%89%203%20%E3%81%A7%E7%A9%8D%E3%81%BF%E4%B8%8A%E3%81%92%E3%81%9F%E5%A2%97%E3%81%88%E6%96%B9%E3%81%AB%E6%AF%94%E3%81%B9%E3%81%A6%E3%81%9A%E3%81%A3%E3%81%A8%E5%B0%8F%E3%81%95%E3%81%84**%E3%80%82%0A%20%20%20%20%E5%8A%B9%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%20CUDA%20%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%0A%20%20%20%20**%E8%A6%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8C%E6%8A%B1%E3%81%88%E3%82%8B%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%95**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%821%20%E3%81%8B%E3%82%89%203%20%E3%81%B8%20import%20%E3%82%92%E7%A9%8D%E3%82%80%E3%81%A0%E3%81%91%E3%81%A7%0A%20%20%20%20%E7%A9%BA%E3%83%97%E3%83%BC%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E3%81%AF%E6%95%B0%E5%80%8D%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%815%20%E3%81%8B%E3%82%89%206%20%E3%81%AE%E5%A2%97%E5%8A%A0%E3%82%82%E3%80%81GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E7%A2%BA%E4%BF%9D%E3%81%97%E3%81%9F%0A%20%20%20%20%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A8%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%AD%E3%83%83%E3%82%AF%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E5%90%AB%E3%82%80%20footprint%20%E5%85%A8%E4%BD%93%E3%81%AE%E5%A2%97%E5%8A%A0%E3%81%AB%E3%82%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(empty_pool_seconds%2C%20fork_cost_before_cuda%2C%20pd%2C%20subprocess%2C%20summary%2C%20sys)%3A%0A%20%20%20%20_%20%3D%20summary%20%20%23%20GPU%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%80%9A%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AB%E6%B8%AC%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E4%BE%9D%E5%AD%98%0A%0A%20%20%20%20FORK_PROBE%20%3D%20%22%22%22%0A%20%20%20%20import%20concurrent.futures%20as%20cf%0A%20%20%20%20import%20time%0A%20%20%20%20from%20multiprocessing%20import%20get_context%0A%20%20%20%20%7Bsetup%7D%0A%20%20%20%20start%20%3D%20time.perf_counter()%0A%20%20%20%20with%20cf.ProcessPoolExecutor(max_workers%3D8%2C%20mp_context%3Dget_context(%22fork%22))%20as%20executor%3A%0A%20%20%20%20%20%20%20%20list(executor.map(int%2C%20range(8)))%0A%20%20%20%20print(time.perf_counter()%20-%20start)%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20def%20probe_fork(setup%3A%20str)%3A%0A%20%20%20%20%20%20%20%20completed%20%3D%20subprocess.run(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5Bsys.executable%2C%20%22-c%22%2C%20FORK_PROBE.format(setup%3Dsetup)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20capture_output%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20timeout%3D600%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20check%3DTrue%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20float(completed.stdout.strip().splitlines()%5B-1%5D)%0A%0A%20%20%20%20fork_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%22parent%22%3A%20%221.%20bare%20python%22%2C%20%22empty_pool_ms%22%3A%20probe_fork(%22%22)%20*%201e3%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22parent%22%3A%20%222.%20%2B%20import%20torch%22%2C%20%22empty_pool_ms%22%3A%20probe_fork(%22import%20torch%22)%20*%201e3%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22parent%22%3A%20%223.%20%2B%20import%20cupy%2C%20dask%2C%20pandas%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22empty_pool_ms%22%3A%20probe_fork(%22import%20cupy%2C%20dask.dataframe%2C%20pandas%2C%20torch%22)%20*%201e3%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22parent%22%3A%20%224.%20%2B%20CUDA%20context%20created%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22empty_pool_ms%22%3A%20probe_fork(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22import%20cupy%2C%20dask.dataframe%2C%20pandas%2C%20torch%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'%20torch.zeros(1%2C%20device%3D%22cuda%22)%3B%20torch.cuda.synchronize()'%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20*%201e3%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22parent%22%3A%20%225.%20this%20notebook%2C%20before%20GPU%22%2C%20%22empty_pool_ms%22%3A%20fork_cost_before_cuda%20*%201e3%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22parent%22%3A%20%226.%20this%20notebook%2C%20after%20GPU%22%2C%20%22empty_pool_ms%22%3A%20empty_pool_seconds()%20*%201e3%7D%2C%0A%20%20%20%20%5D%0A%20%20%20%20pd.DataFrame(fork_rows).round(1)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
44f498962939986737b24846bb30f16a