{"id":10020425,"date":"2024-11-28T18:47:41","date_gmt":"2024-11-28T10:47:41","guid":{"rendered":"https:\/\/itmax.cn\/?p=10020425"},"modified":"2024-11-28T18:47:41","modified_gmt":"2024-11-28T10:47:41","slug":"%e3%80%90triton-%e6%95%99%e7%a8%8b%e3%80%91libdevice-tl_extra-libdevice-%e5%87%bd%e6%95%b0","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10020425","title":{"rendered":"\u3010Triton \u6559\u7a0b\u3011Libdevice (tl_extra.libdevice) \u51fd\u6570"},"content":{"rendered":"<p>Triton \u662f\u4e00\u79cd\u7528\u4e8e\u5e76\u884c\u7f16\u7a0b\u7684\u8bed\u8a00\u548c\u7f16\u8bd1\u5668\u3002\u5b83\u65e8\u5728\u63d0\u4f9b\u4e00\u4e2a\u57fa\u4e8e Python \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u4ee5\u9ad8\u6548\u7f16\u5199\u81ea\u5b9a\u4e49 DNN \u8ba1\u7b97\u5185\u6838\uff0c\u5e76\u80fd\u591f\u5728\u73b0\u4ee3 GPU \u786c\u4ef6\u4e0a\u4ee5\u6700\u5927\u541e\u5410\u91cf\u8fd0\u884c\u3002<\/p>\n<p>\u66f4\u591a Triton \u4e2d\u6587\u6587\u6863\u53ef\u8bbf\u95ee \u2192<a href=\"https:\/\/link.segmentfault.com\/?enc=O4tkMYGykwvcMGQwnC%2B3XA%3D%3D.14DO8rXdqA6%2F5kA5iFcgYUY%2BhfpLJONh6NaYlP4lOsw%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https:\/\/triton.hyper.ai\/<\/a><\/p>\n<p>Triton \u53ef\u4ee5\u8c03\u7528\u5916\u90e8\u5e93\u4e2d\u7684\u81ea\u5b9a\u4e49\u51fd\u6570\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 libdevice \u5e93\u5728\u5f20\u91cf\u4e0a\u5e94\u7528 asin \u51fd\u6570\u3002\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\u83b7\u53d6\u5173\u4e8e\u6240\u6709\u53ef\u7528 libdevice \u51fd\u6570\u8bed\u4e49\u7684\u8be6\u7ec6\u4fe1\u606f\uff1a<\/p>\n<ul>\n<li>CUDA\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=Wr%2B2zflY%2BY%2ByE2qZhT2vqQ%3D%3D.CjSqG5WC0%2BH615bgMWiLaNZVyocPGyc0W3hpw9rU6o%2FolsKIl4TZLf6jgPHkKHht6y3zupgm2zuKMr5frrGBYw%3D%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https:\/\/docs.nvidia.com\/cuda\/libdevice-users-guide\/index.html<\/a><\/li>\n<li>HIP\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=SFYpY%2BXilLisWJtgm7Gsdg%3D%3D.SyZuexcjq8uoNUkp20xaHU%2BL7dzrM6iCcjC4UV3Z0kW0Lv2EPh10D345S1ENQyKZRqc9dTuwXiAI82zB97lghko%2Bc%2BLTsymbS0c27sIlDyE%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https:\/\/github.com\/ROCm\/llvm-project\/tree\/amd-staging\/amd\/device-libs\/ocml\/src<\/a><\/li>\n<\/ul>\n<p>\u5728 libdevice.py \u4e2d\uff0c\u6211\u4eec\u8bd5\u56fe\u5c06\u76f8\u540c\u8ba1\u7b97\u4f46\u4e0d\u540c\u6570\u636e\u7c7b\u578b\u7684\u51fd\u6570\u805a\u5408\u5728\u4e00\u8d77\u3002\u4f8b\u5982\uff0c__nv_asin \u548c __nv_asinf \u90fd\u8ba1\u7b97\u8f93\u5165\u7684\u53cd\u6b63\u5f26\u7684\u4e3b\u503c\uff0c\u4f46 __nv_asin \u9002\u7528\u4e8e double \u7c7b\u578b\uff0c\u800c __nv_asinf \u9002\u7528\u4e8e float \u7c7b\u578b\u3002\u4f7f\u7528 Triton\uff0c\u60a8\u53ef\u4ee5\u7b80\u5355\u5730\u8c03\u7528 tl.math.asin\u3002\u6839\u636e\u8f93\u5165\u548c\u8f93\u51fa\u7c7b\u578b\uff0cTriton \u4f1a\u81ea\u52a8\u9009\u62e9\u6b63\u786e\u7684\u5e95\u5c42\u8bbe\u5907\u51fd\u6570\u6765\u8c03\u7528\u3002<\/p>\n<h2>asin \u5185\u6838<\/h2>\n<pre><code class=\"c\">import torch\n\n\nimport triton\nimport triton.language as tl\nfrom triton.language.extra import libdevice\n\n\n\n\n@triton.jit\ndef asin_kernel(\n    x_ptr,\n    y_ptr,\n    n_elements,\n    BLOCK_SIZE: tl.constexpr,\n):\n    pid = tl.program_id(axis=0)\n    block_start = pid * BLOCK_SIZE\n    offsets = block_start + tl.arange(0, BLOCK_SIZE)\n    mask = offsets &lt; n_elements\n    x = tl.load(x_ptr + offsets, mask=mask)\n    x = libdevice.asin(x)\n    tl.store(y_ptr + offsets, x, mask=mask)<\/code><\/pre>\n<h2>\u4f7f\u7528\u9ed8\u8ba4\u7684 libdevice \u5e93\u8def\u5f84<\/h2>\n<p>\u53ef\u4ee5\u4f7f\u7528 triton\/language\/math.py \u4e2d\u7f16\u7801\u7684\u9ed8\u8ba4 libdevice \u5e93\u8def\u5f84\u3002<\/p>\n<pre><code class=\"c\">torch.manual_seed(0)\nsize = 98432\nx = torch.rand(size, device='cuda')\noutput_triton = torch.zeros(size, device='cuda')\noutput_torch = torch.asin(x)\nassert x.is_cuda and output_triton.is_cuda\nn_elements = output_torch.numel()\ngrid = lambda meta: (triton.cdiv(n_elements, meta['BLOCK_SIZE']), )\nasin_kernel[grid](x, output_triton, n_elements, BLOCK_SIZE=1024)\nprint(output_torch)\nprint(output_triton)\nprint(f'The maximum difference between torch and triton is '\n      f'{torch.max(torch.abs(output_torch - output_triton))}')<\/code><\/pre>\n<p>Out:<\/p>\n<blockquote><p>tensor([0.4105, 0.5430, 0.0249, &#8230;, 0.0424, 0.5351, 0.8149],<br \/>device=&#8217;cuda:0&#8242;) tensor([0.4105, 0.5430, 0.0249, &#8230;, 0.0424, 0.5351,<br \/>0.8149], device=&#8217;cuda:0&#8242;) The maximum difference between torch and triton is 2.384185791015625e-07<\/p><\/blockquote>\n<h2>\u5b9a\u5236 libdevice \u5e93\u8def\u5f84<\/h2>\n<p>\u53ef\u4ee5\u901a\u8fc7\u5c06 libdevice \u5e93\u7684\u8def\u5f84\u4f20\u9012\u7ed9 asin \u5185\u6838\u6765\u5b9a\u5236 libdevice \u5e93\u7684\u8def\u5f84\u3002<\/p>\n<pre><code class=\"c\">output_triton = torch.empty_like(x)\nasin_kernel[grid](x, output_triton, n_elements, BLOCK_SIZE=1024)\nprint(output_torch)\nprint(output_triton)\nprint(f'The maximum difference between torch and triton is '\n      f'{torch.max(torch.abs(output_torch - output_triton))}')<\/code><\/pre>\n<p>Out:<\/p>\n<blockquote><p>tensor([0.4105, 0.5430, 0.0249, &#8230;, 0.0424, 0.5351, 0.8149],<br \/>device=&#8217;cuda:0&#8242;) tensor([0.4105, 0.5430, 0.0249, &#8230;, 0.0424, 0.5351,<br \/>0.8149], device=&#8217;cuda:0&#8242;) The maximum difference between torch and triton is 2.384185791015625e-07<\/p><\/blockquote>\n<p><a href=\"https:\/\/link.segmentfault.com\/?enc=aYqFifkCGUj1C9lEMfTldw%3D%3D.8tqMBdKTqtB7OyZoptFLqh7lKggBktJrC7T27ku2zpKx8Di8okYziIQWBk6RnGjRmakKsWir2bya1Xs5v9aOqXBcARk99RgasW93AEz8eriPCq6GXcfetwvIO3eEDOmiTNuqtipHBZmX5ZiYmiVU4g%3D%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Download Jupyter notebook: 07-extern-functions.ipynb<\/a><\/p>\n<p><a href=\"https:\/\/link.segmentfault.com\/?enc=cYxJ8kEaMGTaQziYtFzutw%3D%3D.g3UaBWn8yUMqLyHY3JJezo09gHlOHwW%2FvJlRfOS4TjidEw4fjCMRWQJFqcnmKT2v3CGN24wrfrezJ3ZzaUKkqHjN24CmHYpKY4Qs2ZGyz8ZpF3tyKWf55xbk%2FY1Ia%2F23\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Download Python source code: 07-extern-functions.py<\/a><\/p>\n<p><a href=\"https:\/\/link.segmentfault.com\/?enc=5pj75OpR0bSUe4kKe4P9Yg%3D%3D.aaa9t0m%2FpekwF1SJFi1LNpWWL%2F8QeClICZX60t0SYvIeSDxJeMO%2FqfjgnV5wL7lEV2oOKkufSk9KKgvBtyvgmacJPgVzLStMcYs0WESpxlACctbjUoHYHI5iD30WweuDS9qrGRlHN2SGCNaGLaTrBg%3D%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Download zipped: 07-extern-functions.zip<\/a><\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000045512877\">https:\/\/segmentfault.com\/a\/1190000045512877<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Triton \u662f\u4e00\u79cd\u7528\u4e8e\u5e76\u884c\u7f16\u7a0b\u7684\u8bed\u8a00\u548c\u7f16\u8bd1\u5668\u3002\u5b83\u65e8\u5728\u63d0\u4f9b\u4e00\u4e2a\u57fa\u4e8e Python \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u4ee5\u9ad8\u6548\u7f16\u5199\u81ea\u5b9a\u4e49 [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10020425","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10020425"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020425\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10020425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10020425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10020425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}