首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >库达:共享记忆总是有用的吗?

库达:共享记忆总是有用的吗?
EN

Stack Overflow用户
提问于 2013-11-15 10:00:24
回答 1查看 250关注 0票数 2

当我阅读编程指南时,我感觉到共享内存总是会提高性能,但似乎没有。我有两个职能:

代码语言:javascript
运行
复制
const int Ntimes=1;

__global__ void testgl(float *A, float *C, int numElements){

    int ti = threadIdx.x;
    int b0 = blockDim.x*blockIdx.x;

    if (b0+ti < numElements){
        for(int i=0;i<Ntimes;i++){
            A[b0+ti]=A[b0+ti]*A[b0+ti]*10-2*A[b0+ti]+1;
        }
        C[b0+ti] = A[b0+ti]*A[b0+ti];
    }
}


__global__ void testsh(float *A, float *C, int numElements){

    int ti = threadIdx.x;
    int b0 = blockDim.x*blockIdx.x;

    __shared__ float a[1024];

    if (b0+ti < numElements){
        a[ti]=A[b0+ti];
    }

    __syncthreads();

    if (b0+ti < numElements){
        for(int i=0;i<Ntimes;i++){
            a[ti]=a[ti]*a[ti]*10-2*a[ti]+1;
        }
        C[b0+ti] = a[ti]*a[ti];
    }
}

int main(void){

    int numElements = 500000;
    size_t size = numElements * sizeof(float);

    // Allocate the host input
    float *h_A = (float *)malloc(size);
    float *h_B = (float *)malloc(size);

    // Allocate the host output
    float *h_C = (float *)malloc(size);
    float *h_D = (float *)malloc(size);


    // Initialize the host input
    for (int i = 0; i < numElements; i++){
        h_A[i] = rand()/(float)RAND_MAX;
        h_B[i] = h_A[i];
    }

    // Allocate the device input
    float *d_A = NULL; cudaMalloc((void **)&d_A, size);
    float *d_B = NULL; cudaMalloc((void **)&d_B, size);
    float *d_C = NULL; cudaMalloc((void **)&d_C, size);
    float *d_D = NULL; cudaMalloc((void **)&d_D, size);


    //Copy to Device
    cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);  
    cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);


    // Launch the Vector Add CUDA Kernel
    int threadsPerBlock = 1024;
    int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;

    testgl<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_C, numElements);

    testsh<<<blocksPerGrid, threadsPerBlock>>>(d_B, d_D, numElements);

    // Copy the device resultto the host 
    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
    cudaMemcpy(h_D, d_D, size, cudaMemcpyDeviceToHost);


    // Free device global memory
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);
    cudaFree(d_D);

    // Free host memory
    free(h_A);
    free(h_B);
    free(h_C);
    free(h_D);

    // Reset the device and exit
    cudaDeviceReset();

    return 0;
}

如果Ntime设置为1,testgl将花费49 is,testsh将花费97 is。如果Ntime设置为100,testgl将花费9.7ms,testsh将花费8.9ms。

我不知道为什么它比它长100倍多。

因此,似乎只有当我们想在设备中做很多事情时,共享内存才会有所帮助,对吗?

这里使用的卡是GTX680

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-15 10:16:23

共享内存将始终提高性能

那不是真的。这取决于算法。如果您在内核中有一个完全合并的内存访问,并且您只访问全局内存一次,它可能没有帮助。但是,如果你正在实现,假设矩阵乘法,你需要持有部分和,那么它将是有用的。

如果您在内核中多次访问相同的内存位置,在这种情况下也会有所帮助,因为共享内存延迟是全局内存的100倍,因为它的片上内存。

当您分析内核是带宽受限的时,就可以考虑是否存在使用共享内存的范围并提高性能。它还可以更好地检查占用率计算器,以检查共享内存的使用是否会影响占用率。

只有当我们想在设备中做很多事情时,共享内存才有帮助?

部分是的。当我们想在设备中做很多事情时,共享内存会有所帮助。

在上面的内核中,当您在内核中多次访问全局内存时,它应该会有所帮助。如果您能够提供完整的复制器来分析代码,这将是很有帮助的。此外,它将有助于了解您正在运行的卡的详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19998335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档