我只是注意到我的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]
有人能解释为什么吗?
我试图在程序的不同部分使用不同数量的线程,以实现最大的加速。但是,发现使用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)