CUDA-全局内存读取-实验(缓存+非缓存-Fermi架构-sm2.1)

特别声明: 设备GT540M, 计算能力2.1.代码附在后面;

缓存加载:

(1)Fermi架构,默认情况是启用L1缓存,即采用128字节内存事务。

  采用不同的偏移量,以实现非对齐访问。命令行为:“nvprof --metircs gld_efficiency test.exe N” (N为偏移量)。采用批处理,计算0-255的偏移量的全局内存加载效率,统计结果如下:偏移量每隔32,跳变一次。




非缓存加载(L2缓存)

(1)Fermi架构,编译命令:-Xptxas -dlcm=cg 禁用L1缓存,即采用32字节内存事务。偏移量每隔8,跳变一次。







代码如下:

#include"iostream"
#include"cuda_runtime.h"
#include"device_launch_parameters.h"
using namespace std;
__global__ void fun1(float* datain,float* dataout,int n,int offset)
{
    int idx=threadIdx.x+blockIdx.x*blockDim.x;
    int k=idx+offset;
    if(k<n)
        datain[idx]=datain[k]+dataout[k];
}
int main(int argc,char* argv[])
{
	int offset = atoi(argv[1]);
	cout << offset << endl;
    const int N=512*15000;
    float* h_out,*h_in,*d_in,*d_out;

    cudaMallocHost((void**)&h_in,N*sizeof(float));
    cudaMallocHost((void**)&h_out,N*sizeof(float));
    cudaMalloc((void**)&d_in,N*sizeof(float));
    cudaMalloc((void**)&d_out,N*sizeof(float));
    for(int i=0;i<N;i++)
    {
        h_in[i]=i;
    }
    cudaMemcpy(d_in,h_in,N*sizeof(float),cudaMemcpyHostToDevice); 
    fun1<<<15000,512>>>(d_in,d_out,N,offset);
    cudaMemcpy(d_out,h_out,N*sizeof(float),cudaMemcpyDeviceToHost); 
    
    cudaDeviceSynchronize();
    return 0;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值