Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cuda中的共享内存_C_Memory_Cuda - Fatal编程技术网

cuda中的共享内存

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

我有一个矩阵u,大小为NxN的复杂数据,我想用一个大小为1xN的向量k乘以每一行的元素。u中的数据按行存储

我有两个实现。一种利用共享内存,将矩阵划分为分片,另一种不利用

我发现共享内存实现multiply1并没有更快,而且系统上与multiply2一样快,甚至更慢

共享内存实现如下:

__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