{"id":1874,"date":"2023-08-05T23:23:00","date_gmt":"2023-08-05T14:23:00","guid":{"rendered":"https:\/\/oboki.net\/workspace\/?p=1874"},"modified":"2025-08-12T00:10:03","modified_gmt":"2025-08-11T15:10:03","slug":"cuda-ide-on-vscode-1","status":"publish","type":"post","link":"https:\/\/oboki.net\/workspace\/c\/cuda-ide-on-vscode-1\/","title":{"rendered":"VSCode \uc5d0\uc11c CUDA (nvcc) \uac1c\ubc1c \ud658\uacbd \uc124\uc815\ud558\uae30 &#8211; 1"},"content":{"rendered":"<p><a href=\"https:\/\/oboki.net\/workspace\/system\/linux\/nvidia-container-runtime-on-rocky-linux\/\">\uc774\uc804 \ud3ec\uc2a4\ud305<\/a>\uc5d0\uc11c \uadf8\ub798\ud53d \uce74\ub4dc \ubd99\uc740 \uc2dc\uc2a4\ud15c\uae4c\uc9c0\ub294 \uad6c\uc131\ud588\uace0 \uc774\uc5b4\uc11c \uac1c\ubc1c\ud658\uacbd \uad6c\ucd95\uc744 \uc704\ud55c \uccab\uac78\uc74c. \uc0ac\uc2e4 <code>NVIDIA Container Runtime<\/code> \ub9cc \uad6c\uc131\ud558\uba74 <a href=\"https:\/\/catalog.ngc.nvidia.com\/containers\">NVIDIA NGC<\/a> \uc5d0\uc11c <code>CUDA<\/code> \ubfd0\ub9cc \uc544\ub2c8\ub77c \uc5ec\ub7ec \ub77c\uc774\ube0c\ub7ec\ub9ac, \ud504\ub808\uc784\uc6cc\ud06c \ubc84\uc804\ubcc4 \uc774\ubbf8\uc9c0\ub97c \uc81c\uacf5\ud574\uc8fc\ub2e4\ubcf4\ub2c8 \uc9c1\uc811 \ubc84\uc804\ubcc4\ub85c \uad6c\uc131\ud574\ub193\uc744 \ud544\uc694\uac00 \uc5c6\uc5b4\uc11c \uc2dc\uc2a4\ud15c\uc744 \uae54\ub054\ud558\uac8c \uad00\ub9ac\ud560 \uc218\ub3c4 \uc788\uace0 \uc9d1\uc5d0 \uc788\ub294 \uac1c\uc778 \uc7a5\ube44, Cloud Workspace \uadf8\ub9ac\uace0 \ud3d0\uc1c4\ub9dd\uc778 \ud68c\uc0ac \uc5c5\ubb34 \ud658\uacbd\uc5d0 \uae4c\uc9c0 \uc77c\uad00\ub41c \uac1c\ubc1c\ud658\uacbd\uc744 \uad6c\uc131\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.<\/p>\n<p><code>VSCode<\/code> \uc5d0\uc11c <code>Docker<\/code> \uc640 <code>Dev Conatainers<\/code> \ud655\uc7a5\ub9cc \uc774\uc6a9\ud574\ub3c4 \uc81c\ubc95 \uadf8\ub7f4\uc2f8\ud560 \uac83 \uac19\uc740\ub370 \uc77c\ub2e8 NGC \uc5d0\uc11c \uc544\ubb34 \uac1c\ubc1c \uc774\ubbf8\uc9c0\ub97c \ud558\ub098 \ub300\ucda9 \ubc1b\uc544\ub2e4\uac00<\/p>\n<p><code>vim docker-compose.yml<\/code><\/p>\n<pre><code class=\"language-yml\">version: &#039;3&#039;\n\nservices:\n  nvcc:\n    image: nvcr.io\/nvidia\/cuda:11.3.0-devel-ubuntu20.04\n    command: nvcc matmul.cu\n    working_dir: \/src\n    volumes:\n      - .\/src:\/src<\/code><\/pre>\n<p>\ubb34\ub824 8\ub144 \uc804, \ud559\ubd80\uc2dc\uc808 \ub9cc\ub4e4\uc5b4\ub193\uc740 <code>matmul<\/code> \ucf54\ub4dc\ub97c \ub3cc\ub824\ubd24\ub294\ub370<\/p>\n<p><code>vim src\/matmul.cu<\/code><\/p>\n<pre><code class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;time.h&gt;\n#include &lt;cuda.h&gt;\n\n__global__ void MatrixMulKernel(float* Md, float* Nd, float* Pd, int width) {\n    int tx = blockIdx.x * blockDim.x + threadIdx.x;\n    int ty = blockIdx.y * blockDim.y + threadIdx.y;\n    float Pvalue = 0;\n    for (int k = 0; k &lt; width; ++k) {\n        float Mdelement = Md[ty * width + k];\n        float Ndelement = Nd[k * width + tx];\n        Pvalue += Mdelement * Ndelement;\n    }\n    Pd[ty * width + tx] = Pvalue;\n}\n\nvoid MatrixMultiplication(float* M, float* N, float* P, int width) {\n    int size = width * width * sizeof(float);\n    float *Md, *Nd, *Pd;\n\n    cudaMalloc((void**) &amp;Md, size);\n    cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);\n    cudaMalloc((void**) &amp;Nd, size);\n    cudaMemcpy(Nd, N, size, cudaMemcpyHostToDevice);\n    cudaMalloc((void**) &amp;Pd, size);\n\n    dim3 dimBlock(16, 16);\n    dim3 dimGrid((width + dimBlock.x - 1) \/ dimBlock.x,\n                 (width + dimBlock.y - 1) \/ dimBlock.y);\n\n    MatrixMulKernel&lt;&lt;&lt;dimGrid, dimBlock&gt;&gt;&gt;(Md, Nd, Pd, width);\n    cudaDeviceSynchronize();\n\n    cudaMemcpy(P, Pd, size, cudaMemcpyDeviceToHost);\n\n    cudaFree(Md);\n    cudaFree(Nd);\n    cudaFree(Pd);\n}\n\nint main() {\n    clock_t start = clock();\n    printf(&quot;program start\\n&quot;);\n\n    int width = 1000;\n    float *M = (float*)malloc(width * width * sizeof(float));\n    float *N = (float*)malloc(width * width * sizeof(float));\n    float *P = (float*)malloc(width * width * sizeof(float));\n\n    for (int i = 0; i &lt; width * width; i++) {\n        M[i] = (i % 2) ? 0.0f : 1.0f;\n        N[i] = (i % 2) ? 1.0f : 0.0f;\n    }\n\n    MatrixMultiplication(M, N, P, width);\n\n    printf(&quot;program finished\\n&quot;);\n    double duration = (double)(clock() - start) \/ CLOCKS_PER_SEC;\n    printf(&quot;%f sec\\n&quot;, duration);\n\n    free(M);\n    free(N);\n    free(P);\n\n    return 0;\n}<\/code><\/pre>\n<p>\uc774 \ud504\ub85c\uc81d\ud2b8\ub791 \uac19\uc774 \uc788\ub358 <code>Makefile<\/code> \uc5d0\uc11c, \ub2f9\uc2dc \ucd5c\uc2e0 \ubc84\uc804\uc774\uc5c8\uc744, cuda-7.0 \uc4f0\ub3c4\ub85d \uba85\uc2dc\ud574\ub1a8\uae38\ub798 \ubd84\uba85 \ucef4\ud30c\uc77c\uc774 \uc548 \ub420 \uc904 \uc54c\uc558\ub294\ub370 \ub108\ubb34 \uae30\ubcf8 api \ub9cc \uc0ac\uc6a9\ud558\ub294 \ud504\ub85c\uc81d\ud2b8\uc5ec\uc11c \uadf8\ub7f0\uc9c0 \uc2e0\uae30\ud558\uac8c\ub3c4 \uc798 \ub3cc\uc544\uac04\ub2e4.<\/p>\n<pre><code class=\"language-bash\"># docker compose up\n[+] Running 1\/0\n \u283f Container matmul-nvcc-1  Created                                                                           0.0s\n...\nmatmul-nvcc-1 exited with code 0\n# src\/a.out \nprogram start\nprogram finished\n0.172547 sec<\/code><\/pre>\n<p>\uc774\uc5b4\uc11c VSCode\uac00 C\/CUDA IDE \ub85c \uc5bc\ub9c8\ub098 \uc4f8\ub9cc\ud560\uc9c0 \uc774\uac83\uc800\uac83 \ud655\uc7a5\ub4e4\uc744 \uc870\ud569\ud574 \uac1c\ubc1c \ud658\uacbd\uc744 \uad6c\ucd95\ud574\ubcf4\uace0 \ud1a0\uce58 \uac19\uc740 \ud504\ub85c\uc81d\ud2b8 \ub72f\uc5b4\ubcfc \uc218 \uc788\ub294 \ud658\uacbd\uae4c\uc9c0 \ub9cc\ub4e4\uc5b4\ubd10\uc57c\uaca0\ub2e4. \ub354 \ub098\uc544\uac04\ub2e4\uba74 rust \uac1c\ubc1c\ud658\uacbd\uae4c\uc9c0 \uad6c\ucd95\ud574\uc11c <code>PyO3<\/code> \uacf5\ubd80\ud574\ubcf4\uae30.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\uc804 \ud3ec\uc2a4\ud305\uc5d0\uc11c \uadf8\ub798\ud53d \uce74\ub4dc \ubd99\uc740 \uc2dc\uc2a4\ud15c\uae4c\uc9c0\ub294 \uad6c\uc131\ud588\uace0 \uc774\uc5b4\uc11c \uac1c\ubc1c\ud658\uacbd \uad6c\ucd95\uc744 \uc704\ud55c \uccab\uac78\uc74c. \uc0ac\uc2e4 NVIDIA Container Runtime \ub9cc \uad6c\uc131\ud558\uba74 NVIDIA NGC \uc5d0\uc11c CUDA \ubfd0\ub9cc \uc544\ub2c8\ub77c \uc5ec\ub7ec \ub77c\uc774\ube0c\ub7ec\ub9ac, \ud504\ub808\uc784\uc6cc\ud06c \ubc84\uc804\ubcc4 \uc774\ubbf8\uc9c0\ub97c \uc81c\uacf5\ud574\uc8fc\ub2e4\ubcf4\ub2c8 \uc9c1\uc811 \ubc84\uc804\ubcc4\ub85c \uad6c\uc131\ud574\ub193\uc744 \ud544\uc694\uac00 \uc5c6\uc5b4\uc11c \uc2dc\uc2a4\ud15c\uc744 \uae54\ub054\ud558\uac8c \uad00\ub9ac\ud560 \uc218\ub3c4 \uc788\uace0 \uc9d1\uc5d0 \uc788\ub294 \uac1c\uc778 \uc7a5\ube44, Cloud Workspace \uadf8\ub9ac\uace0 \ud3d0\uc1c4\ub9dd\uc778 \ud68c\uc0ac \uc5c5\ubb34 \ud658\uacbd\uc5d0 \uae4c\uc9c0 \uc77c\uad00\ub41c \uac1c\ubc1c\ud658\uacbd\uc744 \uad6c\uc131\ud560 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[201,214,204],"tags":[],"class_list":["post-1874","post","type-post","status-publish","format-standard","hentry","category-c","category-cuda","category-vscode"],"_links":{"self":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/comments?post=1874"}],"version-history":[{"count":0,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1874\/revisions"}],"wp:attachment":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/media?parent=1874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/categories?post=1874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/tags?post=1874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}