小编Rai*_*inn的帖子

CUDA共享内存占用的空间是所需空间的两倍

我只是注意到我的CUDA内核使用的空间是"理论"计算的空间的两倍.例如

__global__ void foo( )
{
    __shared__ double t;
    t = 1;
}
Run Code Online (Sandbox Code Playgroud)

PTX信息显示:
ptxas info :_Z3foov的函数属性,0字节堆栈帧,0字节溢出存储,0字节溢出加载
ptxas info:使用4个寄存器,16字节smem,32字节cmem [0]

但双人的大小只有8.

更多例子:

__global__ void foo( )
{
    __shared__ int t[1024];
    t[0] = 1;
}
Run Code Online (Sandbox Code Playgroud)

ptxas info:使用3个寄存器,8192个字节的smem,32个字节的cmem [0]

有人能解释为什么吗?

cuda shared-memory

5
推荐指数
1
解决办法
304
查看次数

当num_threads变化时,OpenMP并行区域开销增加

我试图在程序的不同部分使用不同数量的线程,以实现最大的加速。但是,发现使用num_threads子句切换线程号会产生大量开销。我正在寻找对此的解释,因为根据我的理解,线程池应始终包含给定数量的线程,而不管调用的实际数量是多少。我也在寻找与此相对的可能解决方法。谢谢。

样例代码:

#include<cstdio>
#include<omp.h>

void omp_sum(int ntd) {
    int s = 0;
    #pragma omp parallel num_threads(ntd)
    {
        int i = omp_get_thread_num();
        #pragma omp atomic
        s += i;
    }
}   

int main()
{
    int N = 100;
    int NT1 = 6, NT2 = 12;
    double t;

    t = omp_get_wtime();
    for(int n=0;n<N;n++) {
        omp_sum(NT1);
    }
    printf("%lf\n", (omp_get_wtime() - t) * 1e6 );

    t = omp_get_wtime();
    for(int n=0;n<N;n++) {
        omp_sum(NT2);
    }
    printf("%lf\n", (omp_get_wtime() - t) * 1e6 );

    t = omp_get_wtime();
    for(int n=0;n<N;n++) …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading openmp

5
推荐指数
1
解决办法
319
查看次数

标签 统计

c++ ×1

cuda ×1

multithreading ×1

openmp ×1

shared-memory ×1