CUDA shared memory

2023-11-27  本文已影响0人  leon0514

CUDA 内存模型

内存模型.png
#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
*/
#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;
}
#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;
}

未完待续

上一篇 下一篇

猜你喜欢

热点阅读