{"id":2352,"date":"2022-12-12T15:01:54","date_gmt":"2022-12-12T14:01:54","guid":{"rendered":"https:\/\/ff.mhrooz.xyz\/?p=2352"},"modified":"2022-12-12T15:06:37","modified_gmt":"2022-12-12T14:06:37","slug":"openmp_scheduling","status":"publish","type":"post","link":"https:\/\/blog.mhrooz.xyz\/index.php\/2022\/12\/12\/openmp_scheduling\/","title":{"rendered":"OpenMP: Scheduling"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">\u672c\u6587\u4f8b\u5b50\u5904\u4ee3\u7801\u5757\u7531\u4e8e\u884c\u5bbd\u4e0d\u591f\uff0c\u53ef\u80fd\u4f1a\u5bf9\u8bfb\u8005\u9020\u6210\u4e0d\u4fbf\uff0c\u53ef\u4ee5\u5c06\u6587\u672c\u5185\u5bb9\u590d\u5236\u5230notepad\u6216\u8005\u662fvisual studio code\u4e2d\u67e5\u770b\uff0c\u656c\u8bf7\u8c05\u89e3\u3002<\/pre>\n\n\n\n<p>OpenMP\u7684\u7279\u957f\u5c31\u5728\u4e8e\u5e76\u884c\u5faa\u73af\u3002\u6211\u4eec\u77e5\u9053\u4e0b\u9762\u8fd9\u6bb5\u4ee3\u7801\u53ef\u4ee5\u542f\u7528\u5e76\u884c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#pragma omp parallel for<br>for ( ... )<br>{ ... }<\/pre>\n\n\n\n<p>OpenMP\u5bf9\u4e8e\u5e76\u884c\u5316\u5faa\u73af\uff0c\u4f1a\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b\u6c60\uff0c\u7136\u540e\u628afor\u5faa\u73af\u91cc\u7684\u8fd0\u7b97\u5206\u914d\u7ed9\u7ebf\u7a0b\u3002\u8fd9\u91cc\u7684\u8fd0\u7b97\u662f\u6307\u4e00\u8f6efor\u5faa\u73af(\u5faa\u73af\u4e0b\u6807+1)\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Scheduling<\/h3>\n\n\n\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8ba8\u8bba\u4e00\u4e0b\u7a0b\u5e8f\u5458\u5982\u4f55\u51b3\u5b9a\u4e00\u4e2a\u5faa\u73af\u7684scheduling\u7c7b\u578b\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Explicit<\/h4>\n\n\n\n<p>\u5982\u679c\u6709\u4e00\u4e2a\u663e\u5f0f<code>schedule<\/code>\u5b50\u53e5:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#pragma omp parallel for schedule(scheduling-type)<br>for (...)<br>{ ... }<\/pre>\n\n\n\n<p>\u90a3\u4e48OpenMP\u5c31\u4f1a\u4f7f\u7528<code>scheduling-type<\/code>\u6765\u8bbe\u5b9afor loop\u7684\u5e76\u884c\u65b9\u5f0f\u3002<\/p>\n\n\n\n<p>scheduling-type\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul>\n<li><code>static<\/code><\/li>\n\n\n\n<li><code>dynamic<\/code><\/li>\n\n\n\n<li><code>guided<\/code><\/li>\n\n\n\n<li><code>auto<\/code><\/li>\n\n\n\n<li><code>runtime<\/code><\/li>\n<\/ul>\n\n\n\n<p>\u6211\u4eec\u4f1a\u5728\u540e\u9762\u8be6\u7ec6\u8ba8\u8bba\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Runtime<\/h4>\n\n\n\n<p>\u5982\u679c<code>scheduling-type<\/code>\uff08\u5728\u5b8f\u5b9a\u4e49\u91cc\uff09\u662f<code>runtime<\/code>\uff0c\u90a3\u4e48OpenMP\u5c06\u4f1a\u8c03\u7528\u7cfb\u7edf\u8bbe\u5b9a\u7684<code>run-sched-var<\/code>\u6765\u51b3\u5b9aschedule\u7c7b\u578b\u3002\u8bbe\u5b9aOpenMP\u4e2d\u7684<code>run-sched-var<\/code>\u7531\u4e24\u79cd\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol>\n<li>\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8bbe\u5b9a\u73af\u5883\u53d8\u91cf<code>OMP_SCHEDULE<\/code>\u6765\u8bbe\u5b9a<code>run-sched-var<\/code>\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u4f8b\u5982\u6211\u4eec\u5728bash-like\u7684\u7ec8\u7aef\u91cc\u8f93\u5165<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ export OMP_SCHEDULE=scheduling-type<\/pre>\n\n\n\n<p>\u6765\u8bbe\u5b9a\u73af\u5883\u53d8\u91cf<code>OMP_SCHEDULE<\/code>\u3002<\/p>\n\n\n\n<ol start=\"2\">\n<li>\u53e6\u5916\u6211\u4eec\u4e5f\u53ef\u4ee5\u5728\u81ea\u5df1\u7a0b\u5e8f\u91cc\u8c03\u7528\u51fd\u6570\u8bbe\u5b9a\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">...<br>omp_set_schedule(scheduling-type);<br>...<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Default<\/h4>\n\n\n\n<p>\u5982\u679c\u6ca1\u6709\u663e\u5f0f\u6307\u5b9aschedule\u5b50\u53e5<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#pragma omp parallel for<br>for (...)<br>{ ... }<\/pre>\n\n\n\n<p>\u90a3\u4e48OpenMP\u4f7f\u7528<code>Default<\/code> scheduling\u6a21\u5f0f\u3002\u5177\u4f53\u4f7f\u7528\u7684\u7c7b\u578b\u5c06\u7531OpemMP\u5185\u90e8\u53d8\u91cf<code>def-shed-var<\/code>\u51b3\u5b9a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The scheduling types<\/h3>\n\n\n\n<p>\u6b63\u5982\u524d\u9762\u63d0\u5230\u8fc7\u7684\uff0c\u4e00\u5171\u6709\u4e94\u79cdscheduing\u7c7b\u578b<\/p>\n\n\n\n<p>scheduling-type\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul>\n<li><code>static<\/code><\/li>\n\n\n\n<li><code>dynamic<\/code><\/li>\n\n\n\n<li><code>guided<\/code><\/li>\n\n\n\n<li><code>auto<\/code><\/li>\n\n\n\n<li><code>runtime<\/code><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Static<\/h4>\n\n\n\n<p><code>schedule(static, chunk-size)<\/code>\u5b50\u53e5\u6307\u5b9a\u4e86for\u5faa\u73af\u4f7f\u7528<code>static<\/code> schedule\u6a21\u5f0f\u3002OpenMP\u628afor\u7684\u603b\u5171\u6b21\u6570\u5212\u5206\u6210\u4e00\u4e2a\u4e2a\u5c0f\u5757(chunks)\uff0c<code>chunk-size<\/code>\u89c4\u5b9a\u4e86\u6bcf\u4e2a\u7ebf\u7a0b\u4e00\u6b21\u6267\u884c\u591a\u5c11\u6b21for\u5faa\u73af\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u6ca1\u6709\u6307\u5b9a<code>chunk-size<\/code>\uff0cOpenMP\u5c06\u4f1a\u628afor\u7684\u8fed\u4ee3\u5206\u6210\u8fd1\u4e4e\u76f8\u540c\u7684\u5757\uff0c\u7136\u540e\u5c3d\u91cf\u7ed9\u6bcf\u4e2a\u7ebf\u7a0b\u5206\u914d\u8fde\u7eed\u7684\u4e00\u6b21\u8fd0\u7b97\u3002<\/p>\n\n\n\n<p>\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(static): --no chunk-size parameter\n****************\n                ****************\n                                ****************\n                                                ****************<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(static, 4):\n****            ****            ****           ****\n    ****            ****            ****            ****\n        ****            ****            ****            ****\n            ****            ****            ****            ****            <\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(static, 8):\n********                        ********\n        ********                        ********\n                ********                        ********\n                        ********                        ********<\/pre>\n\n\n\n<p>\u5bf9\u4e8e\u8fd9\u4e2a\u4f8b\u5b50\uff0c\u7b80\u5355\u6765\u8bf4\u6211\u4eec\u60f3\u8981\u5e76\u884c\u4e00\u4e2a64\u6b21\u7684\u5faa\u73af\uff0c\u6211\u4eec\u67094\u4e2a\u7ebf\u7a0b\u3002\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u5757\u91cc\uff0c\u6bcf\u4e00\u884c\u4ee3\u8868\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u6bcf\u4e2a*\u5bcc\u8c6a\u4ee3\u8868\u4e00\u6b21\u5faa\u73af\u3002<\/p>\n\n\n\n<p>\u5728\u7b2c\u4e00\u4e2a\u4ee3\u7801\u5757(\u5bf9\u5e94<code>schedule(static)<\/code>)\u91cc\uff0c\u7b2c\u4e00\u4e2a\u7ebf\u7a0b\u8fd0\u884c\u4e8616\u6b21\u5faa\u73af\uff0c\u5047\u8bbefor\u5faa\u73af\u91cc\u7684\u5faa\u73af\u53d8\u91cf\u4e3ai\uff0c\u8fd916\u6b21\u5faa\u73af\u5bf9\u5e94\u4e86<code>i=0,1,2,...15<\/code>\uff0c\u540c\u7406\uff0c\u7b2c\u4e8c\u4e2a\u7ebf\u7a0b\u8fd0\u884c\u4e86<code>i=16,17,18,19...31<\/code><\/p>\n\n\n\n<p>\u5176\u4ed6\u4e24\u4e2a\u4ee5\u6b64\u7c7b\u63a8\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u6267\u884c\u7684\u5206\u522b\u662f\u56db\u4e2a\u8fde\u7eed\u7684\u5faa\u73af\u548c8\u4e2a\u8fde\u7eed\u7684\u5faa\u73af\uff0c\u7c7b\u4f3c<code>i=0,1,2,3,8,9,10,11...<\/code><\/p>\n\n\n\n<p>\u5982\u679c\u6bcf\u4e2a\u5faa\u73af\u90fd\u6709\u76f8\u540c\u7684\u8ba1\u7b97\u65f6\u95f4\u7684\u8bdd\uff0c\u6362\u8a00\u4e4b\uff0c\u5982\u679c\u5faa\u73af\u7684\u8ba1\u7b97\u548c\u5faa\u73af\u53d8\u91cf\u7684\u589e\u52a0\u6ca1\u5173\u7cfb\u7684\u8bdd\uff0c\u4f7f\u7528static\u53ef\u4ee5\u51cf\u5c0f\u989d\u5916\u5f00\u9500\uff08overhead\uff09\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Dynamic<\/h4>\n\n\n\n<p><code>schedule(dynamic, chunk-size)<\/code>\u5b50\u53e5\u6307\u5b9afor loop\u6709\u52a8\u6001\u7684scheduling type\uff0cOpenMP\u5c06\u4f1a\u6839\u636e<code>chunk-size<\/code>\u5212\u5206\u8fd0\u7b97\u5757\u3002\u6bcf\u4e2a\u5757\u5148\u8fd0\u884cOpenMP\u7ed9\u5206\u914d\u597d\u7684\u4e00\u4e2achunk\uff0c\u8fd0\u884c\u5b8c\u4ee5\u540eOpenMP\u5c06\u518d\u6b21\u5206\u914d\u3002\u76f4\u5230\u6ca1\u6709\u5269\u4f59\u5757<\/p>\n\n\n\n<p>\u8fd9\u610f\u5473\u7740\u5728\u8fd0\u884c\u7a0b\u5e8f\u524d\uff0c\u6211\u4eec\u65e0\u6cd5\u9884\u77e5\u7ebf\u7a0b\u548c\u67d0\u6b21\u5faa\u73af\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bcf\u6b21\u8fd0\u884c\u7ebf\u7a0b\u6267\u884c\u7684\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8\u3002<\/p>\n\n\n\n<p>chunk-size\u9ed8\u8ba4\u4e3a1.<\/p>\n\n\n\n<p>\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(dynamic):     \n*   ** **  * * *  *      *  *    **   *  *  * *       *  *   *  \n  *       *     *    * *     * *   *    *        * *   *    *   \n *       *    *     * *   *   *     *  *       *  *  *  *  *   *\n   *  *     *    * *    *  *    *    *    ** *  *   *     *   * <\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(dynamic, 1):  \n    *    *     *        *   *    * *  *  *         *  * *  * *  \n*  *  *   * *     *  * * *    * *      *   ***  *   *         * \n *   *  *  *  *    ** *    *      *  *  * *   *  *   *   *      \n  *    *     *  **        *  * *    *          *  *    *  * *  *<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(dynamic, 4):  \n            ****                    ****                    ****\n****            ****    ****            ****        ****        \n    ****            ****    ****            ****        ****    \n        ****                    ****            ****            <\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(dynamic, 8):  \n                ********                                ********\n                        ********        ********                \n********                        ********        ********        \n        ********                                                <\/pre>\n\n\n\n<p>\u53ef\u4ee5\u53d1\u73b0\u524d\u4e24\u79cdschedule\u662f\u4e00\u81f4\u7684\u3002\u540e\u9762\u4e24\u79cdOpenMP\u5206\u522b\u7ed9\u6bcf\u4e2a\u7ebf\u7a0b4\u6216\u80058\u4e2a\u5927\u5c0f\u7684\u5757\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u8fd0\u884c\u5faa\u73af\u6570\u91cf\u4e0d\u4e00\u5b9a\u76f8\u540c\u3002<\/p>\n\n\n\n<p>\u52a8\u6001scheduling type\u9002\u7528\u4e8e\u5728\u5df2\u77e5\u4e0d\u540c\u7684iteration\u4f1a\u6709\u4e0d\u540c\u7684\u65f6\u95f4\u6d88\u8017(cost)\u3002\u4ea4\u7ed9OpenMP\u6765\u5904\u7406\u8d1f\u8f7d\u53ef\u80fd\u6bd4\u4eba\u624b\u52a8\u4f1a\u9ad8\u6548\u4e00\u4e9b\u3002\u4f46\u662f\u52a8\u6001\u5206\u914d\u7684\u8fc7\u7a0b\u4f1a\u663e\u8457\u63d0\u5347overhead.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Guided<\/h4>\n\n\n\n<p><code>guided<\/code>\u548c<code>dynamic<\/code>\u975e\u5e38\u76f8\u4f3c\u3002\u5bf9\u4e8e<code>guided<\/code>, OpenMP\u4f9d\u7136\u662f\u5c06\u591a\u6b21\u5faa\u73af\u5206\u6210\u4e00\u4e2a\u4e2a\u5757\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u6267\u884c\u5757\uff0c\u6267\u884c\u7ed3\u675f\u540e\u518d\u6b21\u5411OpenMP\u7d22\u8981\u65b0\u5757\uff0c\u76f4\u5230\u6ca1\u6709\u65b0\u5757\u3002<\/p>\n\n\n\n<p>guided\u548cdynamic\u7684\u533a\u522b\u5728\u4e8e\u5757\u7684\u5927\u5c0f\uff0cdynamic\u91cc\u5757\u7684\u5927\u5c0f\u662f\u56fa\u5b9a\u7684\uff0cguided\u7684\u5757\u7684\u5927\u5c0f\u4f1a\u8c03\u6574\u4e3a\u5269\u4f59\u8fed\u4ee3\u7684\u6b21\u6570\u548c\u7ebf\u7a0b\u6570\u4e4b\u6bd4\u3002\u968f\u7740\u7a0b\u5e8f\u7684\u8fd0\u884c\uff0c\u5757\u7684\u5927\u5c0f\u4f1a\u8d8a\u6765\u8d8a\u5c0f\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528<code>chunk-size<\/code>\u53c2\u6570\u6765\u89c4\u5b9a<code>guided<\/code>\u6700\u5c0f\u5757\u7684\u5927\u5c0f\u3002\u4f46\u662f\uff0c\u6700\u540e\u4e00\u6b21\u8fed\u4ee3\u53ef\u80fd\u4f1a\u5c0f\u4e8echunk-size.<\/p>\n\n\n\n<p>chunk-size\u9ed8\u8ba4\u4e3a1<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(guided, 4):   \n                                     *******                    \n                ************                     ****    ****   \n                            *********                           \n****************                            *****    ****    ***<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(guided, 2):   \n                ************                     ****     **    \n                                     *******         ***    **  \n                            *********                           \n****************                            *****       **    **\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(guided):      \n                            *********                        *  \n                ************                     *******  ***   \n                                     *******                   *\n****************                            *****       **    * <\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">schedule(guided, 8):   \n                ************                 ********        ***\n****************                                                \n                                     ********                   \n                            *********                ********<\/pre>\n\n\n\n<p>\u8fd9\u91cc\u4e00\u5171\u670964\u6b21\u8fed\u4ee3\uff0c\u6700\u5f00\u59cb\uff0c\u7cfb\u7edf\u7ed9\u6bcf\u4e2a\u7ebf\u7a0b\u5206\u914d16\u6b21\u8fed\u4ee3(16=64\/4,64\u6b21\u8fed\u4ee3\uff0c4\u4e2a\u7ebf\u7a0b)\uff0c\u4e4b\u540e\u518d\u5206\u914d\u662f12\uff0812=(64-16)\/4\uff09\u6b21\uff0c\u4f9d\u6b21\u7c7b\u63a8\u3002<\/p>\n\n\n\n<p>Guided\u9002\u7528\u4e8e\u6bcf\u6b21\u8fed\u4ee3\u65f6\u95f4\u6d88\u8017\u4e0d\u540c\u7684\u60c5\u51b5\u3002\u5e76\u4e14\u7531\u4e8e\u6700\u5f00\u59cb\u5757\u5f88\u5927\uff0c\u6240\u4ee5\u4f1a\u51cf\u5c11overhead\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Auto<\/h4>\n\n\n\n<p>\u8fd9\u79cd\u60c5\u51b5\u4e0bOpenMP\u81ea\u52a8\u7ed9\u5b9ascheduling\u7c7b\u578b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u4f8b\u5b50\u5904\u4ee3\u7801\u5757\u7531\u4e8e\u884c\u5bbd\u4e0d\u591f\uff0c\u53ef\u80fd\u4f1a\u5bf9\u8bfb\u8005\u9020\u6210\u4e0d\u4fbf\uff0c\u53ef\u4ee5\u5c06\u6587\u672c\u5185\u5bb9\u590d\u5236\u5230notepad\u6216\u8005\u662fvisual st<a class=\"more-link\" href=\"https:\/\/blog.mhrooz.xyz\/index.php\/2022\/12\/12\/openmp_scheduling\/\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">&#8220;OpenMP: Scheduling&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[38,44],"tags":[47,48,46],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/posts\/2352"}],"collection":[{"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=2352"}],"version-history":[{"count":2,"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/posts\/2352\/revisions"}],"predecessor-version":[{"id":2354,"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/posts\/2352\/revisions\/2354"}],"wp:attachment":[{"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=2352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=2352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mhrooz.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=2352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}