美文网首页
CUDA shared memory

CUDA shared memory

作者: leon_tly | 来源:发表于2023-11-27 20:50 被阅读0次

    CUDA 内存模型

    • Global Memory
      全局内存 速度 : 普通,读写。大小 : 显存大小
    • Constant Memory
      速度:很快,只读。大小:一般64KB,16bit寻址
    • Shared Memory
      速度:快,读写。大小:2080ti有48KB
    • Local Memory
      本地内存(其实是全局内存) 速度:普通、读写。大小:可用内存 / SM数量 / SM最大常驻线程数
      类似于栈空间,局部变量
    • Texture Memory
      纹理内存 速度:快、只读(三维渲染)
    • Register
      寄存器 速度:最快,读写 (编译器控制) 资源
    内存模型.png
    • register

    • local memory

    #include <stdio.h>
    #include <cuda_runtime.h>
    
    using namespace std;
    
    static __global__ void test_kernel(){
        int array[3];
        float value = 5;
        __shared__ int shared_value;
        printf("array is local == %s\n", __isLocal(array) ? "true" : "false");
        printf("value is local == %s\n", __isLocal(value ) ? "true" : "false");
        printf("shared_valueis local == %s\n", __isLocal(shared_valueis ) ? "true" : "false");
    }
    
    void local_memory(){
        test_kernel<<<1,1>>>();
        cudaDeviceSynchronize();
    }
    /*
    array is local == true
    value is local == true
    shared_valueis is local == false
    */
    
    • shared memory 1
    #include <stdio.h>
    #include <cuda_runtime.h>
    
    using namespace std;
    
    // 方式2,生命共享的变量,不能给初始值,需要有线程来初始化
    __shared__ int shared_value2;
    
    static __global__ void test_kernel()
    {
        // 方式1,生命静态大小的共享内存,所有block内线程公用
        __shared__ int sharedA_array[8];
    
        // 方式2 ,生命共享的变量,不能给初始值,需要有线程来初始化
        __sahred__ int shared_value1;
        if (threadIdx.x == 0)
        {
            shared_value1 = 2;
            shared_value2 = 3;
            shared_array[0] = 33;
        }
        // 线程同步,所有线程必须都到这里之后才能继续往下运行
        __syncthreads();
        printf("%d,  shared_value1 + 5s, shared_value2 = %d\n", threadIdx.x, shared_value1, shared_value2);
        printf("%d, shared_array[0] = %d\n", shared_array[0]);
    }
    
    int main()
    {
        test_kernel<<<1, 2>>>();
        cudaDeviceSynchronize();
        return 0;
    }
    
    • shared memory 2
    #include <stdio.h>
    #include <cuda_runtime.h>
    
    using namesapce std;
    
    static __global__ void test_kernel()
    {
        // 方式3, 使用extern 声明外部的动态大小共享内存,由启动和函数的第三个参数指定
        extern __shared__ int shared_array[];
        if (threadIdx.x == 0)
        {
            shared_array[0] = blockIdx.x;
        }
        // 线程同步,所有线程必须都到这里之后才能继续往下运行
        __syncthreads();
        printf("%d, %d,  shared_value1 + 5s, shared_array[0]= %d\n", blockIdx.x, threadIdx.x,  shared_array[0]);
      
    }
    
    int main()
    {
        test_kernel<<<2, 2, sizeof(int)*5>>>();
        cudaDeviceSynchronize();
        return 0;
    }
    
    • global memory 1
    
    

    未完待续

    相关文章

      网友评论

          本文标题:CUDA shared memory

          本文链接:https://www.haomeiwen.com/subject/hpqtgdtx.html