cuda中的共享内存
我有一个矩阵u,大小为NxN的复杂数据,我想用一个大小为1xN的向量k乘以每一行的元素。u中的数据按行存储 我有两个实现。一种利用共享内存,将矩阵划分为分片,另一种不利用 我发现共享内存实现multiply1并没有更快,而且系统上与multiply2一样快,甚至更慢 共享内存实现如下:cuda中的共享内存,c,memory,cuda,C,Memory,Cuda,我有一个矩阵u,大小为NxN的复杂数据,我想用一个大小为1xN的向量k乘以每一行的元素。u中的数据按行存储 我有两个实现。一种利用共享内存,将矩阵划分为分片,另一种不利用 我发现共享内存实现multiply1并没有更快,而且系统上与multiply2一样快,甚至更慢 共享内存实现如下: __global__ void multiply1(cufftComplex *u, cufftComplex *k) { __shared__ cufftComplex k_s[BLOCK_WIDTH
__global__ void multiply1(cufftComplex *u, cufftComplex *k) {
__shared__ cufftComplex k_s[BLOCK_WIDTH];
int idx = blockDim.x*blockIdx.x + threadIdx.x;
int idy = blockDim.y*blockIdx.y + threadIdx.y;
int index;
if (threadIdx.y == 0 && idx < N) {
k_s[threadIdx.x] = k[idx];
}
__syncthreads();
if (idx < N && idy < N) {
index = N*idy + idx;
u[index] = cuCmulf(k_s[threadIdx.x],u[index]);
}
}
__global__ void multiply2(cufftComplex *u, cufftComplex *k) {
int idx = blockDim.x * blockIdx.x + threadIdx.x;
if (idx < N*N) {
u[idx] =cuCmulf(k[idx % N],u[idx]);
}
}
\uuuuu全局\uuuu无效倍数1(袖套复合体*u,袖套复合体*k){
__共享袖口复杂k_s[块宽度];
int idx=blockDim.x*blockIdx.x+threadIdx.x;
int-idy=blockDim.y*blockIdx.y+threadIdx.y;
整数指数;
if(threadIdx.y==0&&idx
鉴于全局内存实现如下所示
__global__ void multiply1(cufftComplex *u, cufftComplex *k) {
__shared__ cufftComplex k_s[BLOCK_WIDTH];
int idx = blockDim.x*blockIdx.x + threadIdx.x;
int idy = blockDim.y*blockIdx.y + threadIdx.y;
int index;
if (threadIdx.y == 0 && idx < N) {
k_s[threadIdx.x] = k[idx];
}
__syncthreads();
if (idx < N && idy < N) {
index = N*idy + idx;
u[index] = cuCmulf(k_s[threadIdx.x],u[index]);
}
}
__global__ void multiply2(cufftComplex *u, cufftComplex *k) {
int idx = blockDim.x * blockIdx.x + threadIdx.x;
if (idx < N*N) {
u[idx] =cuCmulf(k[idx % N],u[idx]);
}
}
\uuuuu全局\uuuuu无效倍数2(袖套复合体*u,袖套复合体*k){
int idx=blockDim.x*blockIdx.x+threadIdx.x;
如果(idx
以及主函数调用,用于大小为64x64的矩阵
dim3 block(16,16);
dim3 grid(4,4);
multiply1<<<grid, block>>>(d_u, d_k);
multiply2<<<16, 256>>>(d_u, d_k);
dim3块(16,16);
dim3网格(4,4);
倍数1(d_,d_k);
倍数2(du,duk);
我怎样才能使用分析器来找出为什么倍数1的速度没有得到哪怕是一点点的提高?哪些指标可以说明到底发生了什么
探查器告诉我,对于multiply1,我得到了152 GB/s的全局内存负载吞吐量,而对于multiply2,我得到了81 GB/s。这是合乎逻辑的,因为我从全局内存加载的更少。这不应该转化为更快的执行吗?如果您多次使用它,它会更快,但在这里您只使用了一次。您将问题转化为:
copy from global memory to shared memory
read from shared memory
而不是:
read from global memory
因此,是的,它肯定比以前只使用全局内存的算法慢。如果您想利用共享内存,您的算法将在其中多次读取,如果不这样做的话,您将不会占用全局内存。我从全局内存中复制k的适当元素,每个块一次,而不是每个元素一次,因为If语句:If(threadIdx.y==0&&idx