Cuda 共享内存指针算法

Cuda 共享内存指针算法,cuda,Cuda,我不明白下面几行到底发生了什么: unsigned char*membershipChanged=(unsigned char*)sharedMemory和 float*集群=(float*)(sharedMemory+blockDim.x) 我假设在#1sharedMemory中有效地重命名为membershipChanged,但是为什么要将blockDim添加到sharedMemory指针。这个地址指向哪里 sharedMemory是使用extern\uuuuuuuuuuuuuuuu共享\u

我不明白下面几行到底发生了什么:

  • unsigned char*membershipChanged=(unsigned char*)sharedMemory

  • float*集群=(float*)(sharedMemory+blockDim.x)

  • 我假设在#1
    sharedMemory
    中有效地重命名为
    membershipChanged
    ,但是为什么要将
    blockDim
    添加到
    sharedMemory
    指针。这个地址指向哪里

    sharedMemory
    是使用
    extern\uuuuuuuuuuuuuuuu共享\uuuuuuuuuuuuuu字符sharedMemory[]创建的


    我在文件中找到的代码

    void查找最近的集群(int numCoords,
    int numObjs,
    int numClusters,
    浮动*对象,//[numCoords][numObjs]
    浮动*设备群集,//[numCoords][numClusters]
    int*成员身份,//[numObjs]
    int*中间产物)
    {
    外部共享字符共享内存[];
    //为membershipChanged选择的类型必须足够大,以支持
    //减少!有blockDim.x元素,在
    //街区。
    unsigned char*membershipChanged=(unsigned char*)sharedMemory;
    float*集群=(float*)(sharedMemory+blockDim.x);
    成员身份更改[threadIdx.x]=0;
    //当心:如果共享内存太多,我们可能会溢出共享内存
    //群集或坐标太多!
    对于(int i=threadIdx.x;i
    sharedMemory+blockDim.x
    指向距共享内存区域底部的
    blockDim.x
    字节


    您可能会这样做的原因是在共享内存中进行子分配。内核的启动站点(包括
    find\u nearest\u cluster
    动态地为内核分配一定量的共享存储。该代码意味着两个逻辑上不同的数组驻留在
    sharedMemory--
    成员身份已更改
    ,并且
    群集
    。指针算法只是获取指向第二个数组的指针的一种方法。

    sharedMemory+blockDim.x
    指向距共享内存区域底部的
    blockDim.x
    字节


    您可能会这样做的原因是在共享内存中进行子分配。内核的启动站点(包括
    find\u nearest\u cluster
    动态地为内核分配一定量的共享存储。该代码意味着两个逻辑上不同的数组驻留在
    sharedMemory--
    成员身份已更改
    群集
    。指针算法只是获取指向第二个数组的指针的一种方法。

    外部共享字符共享内存[]
    足以告诉cuda分配所有可用的共享内存吗?否。共享内存在内核启动时使用以下语法动态分配:kernel(args…)。指向动态分配的smem的指针位于extern shared变量处。和
    extern\uuuuu shared\uuuuuuuuuu char sharedMemory[]
    是否足以告诉cuda分配所有可用的共享内存?否。共享内存在内核启动时使用以下语法动态分配:kernel(args…)。指向动态分配的smem的指针位于extern shared变量处。
    void find_nearest_cluster(int numCoords,
                              int numObjs,
                              int numClusters,
                              float *objects,           //  [numCoords][numObjs]
                              float *deviceClusters,    //  [numCoords][numClusters]
                              int *membership,          //  [numObjs]
                              int *intermediates)
    {
    extern __shared__ char sharedMemory[];
    
    //  The type chosen for membershipChanged must be large enough to support
    //  reductions! There are blockDim.x elements, one for each thread in the
    //  block.
    unsigned char *membershipChanged = (unsigned char *)sharedMemory;
    float *clusters = (float *)(sharedMemory + blockDim.x);
    
    membershipChanged[threadIdx.x] = 0;
    
    //  BEWARE: We can overrun our shared memory here if there are too many
    //  clusters or too many coordinates!
    for (int i = threadIdx.x; i < numClusters; i += blockDim.x) {
        for (int j = 0; j < numCoords; j++) {
            clusters[numClusters * j + i] = deviceClusters[numClusters * j + i];
        }
    }
    .....