关于__device__全局变量--变量于数组的问题

如果只是变量,如下即可实现全局变量-

两种方法:

1.

__device__ float devData;


float value = 3.14f;


cudaMemcpyToSymbol(devData,&value,sizeof(float));


cudaMemcpyFromSymbol(&value,devData,sizeof(float));

2.

__device__ float myData;

float * dptr;

cudaGetSymbolAddress((void **)&dptr,myData);

cudaMemcpy(dptr,&value,sizeof(float),cudaMemcpyHostToDevice);


cudaMemcpyFromSymbol(&value,myData,sizeof(float));

如果是数组方式的话,

__device__ float * Data2;


float * myptr,* h_ptr;

h_ptr = (float*)malloc(sizeof(float)*10);


cudaError_t ret =cudaMalloc((void **)&myptr,sizeof(float)*10);

ret = cudaMemcpyToSymbol(Data2,&myptr,sizeof(float *));


cudaMemcpy(h_ptr,Data2,sizeof(float)*10,cudaMemcpyDeviceToHost);
for(int i=0;i<10;i++){
    printf("%f --- \n",h_ptr[i]);
}

也就是说,貌似暂时来看,只能通过先申请一个设备内存块,然后拷贝到全局内存,计算完成后,然后再把全局内存拷贝到设备内存块,然后再从设备内存块中拷贝的主机内存,非常麻烦。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
详细解释一下这段代码,每一句都要进行注解:def get_image_pairs_shortlist(fnames, sim_th = 0.6, # should be strict min_pairs = 20, exhaustive_if_less = 20, device=torch.device('cpu')): num_imgs = len(fnames) if num_imgs <= exhaustive_if_less: return get_img_pairs_exhaustive(fnames) model = timm.create_model('tf_efficientnet_b7', checkpoint_path='/kaggle/input/tf-efficientnet/pytorch/tf-efficientnet-b7/1/tf_efficientnet_b7_ra-6c08e654.pth') model.eval() descs = get_global_desc(fnames, model, device=device) #这段代码使用 PyTorch 的 torch.cdist 函数计算两个矩阵之间的距离,其参数 descs 是一个矩阵,表示一个数据集的所有样本的特征向量。函数将计算两个矩阵的 p 范数距离,即对于矩阵 A 和 B,其 p 范数距离为: #dist_{i,j} = ||A_i - B_j||_p #其 i 和 j 分别表示矩阵 A 和 B 的第 i 和 j 行,||.||_p 表示 p 范数。函数的返回值是一个矩阵,表示所有样本之间的距离。 # detach() 和 cpu() 方法是为了将计算结果从 GPU 转移到 CPU 上,并将其转换为 NumPy 数组。最终的结果将会是一个 NumPy 数组。 dm = torch.cdist(descs, descs, p=2).detach().cpu().numpy() # removing half mask = dm <= sim_th total = 0 matching_list = [] ar = np.arange(num_imgs) already_there_set = [] for st_idx in range(num_imgs-1): mask_idx = mask[st_idx] to_match = ar[mask_idx] if len(to_match) < min_pairs: to_match = np.argsort(dm[st_idx])[:min_pairs] for idx in to_match: if st_idx == idx: continue if dm[st_idx, idx] < 1000: matching_list.append(tuple(sorted((st_idx, idx.item())))) total+=1 matching_list = sorted(list(set(matching_list))) return matching_list
06-01
这段代码定义了一个函数 get_image_pairs_shortlist,用于获取一组图像的相似对。 参数 fnames 是一个包含图像文件名的列表,sim_th 是相似度的阈值,默认值为 0.6,min_pairs 是最小匹配对数,默认值为 20,exhaustive_if_less 是当图像数量小于等于此值时,将执行耗时的穷举匹配操作。device 是指定使用的设备,默认为 CPU。 首先,函数通过 len(fnames) 判断输入的图像数量,如果小于等于 exhaustive_if_less,就直接调用 get_img_pairs_exhaustive 函数执行穷举匹配操作。 如果输入的图像数量大于 exhaustive_if_less,则使用 timm 库创建一个名为 tf_efficientnet_b7 的模型,并加载预训练权重文件 tf_efficientnet_b7_ra-6c08e654.pth。然后将模型设置为评估模式(model.eval())。 接下来,调用 get_global_desc 函数计算输入图像的全局特征描述符。其,fnames 是图像文件名列表,model 是预训练模型,device 是设备类型。 接着,使用 PyTorch 的 torch.cdist 函数计算两个矩阵之间的距离,其参数 descs 是一个矩阵,表示一个数据集的所有样本的特征向量。函数将计算两个矩阵的 p 范数距离,即对于矩阵 A 和 B,其 p 范数距离为: dist_{i,j} = ||A_i - B_j||_p 其 i 和 j 分别表示矩阵 A 和 B 的第 i 和 j 行,||.||_p 表示 p 范数。函数的返回值是一个矩阵,表示所有样本之间的距离。 使用 detach() 和 cpu() 方法将计算结果从 GPU 转移到 CPU 上,并将其转换为 NumPy 数组。 接下来,将距离矩阵小于等于 sim_th 的值设为 True,其余设置为 False,得到一个掩码矩阵 mask。 然后,初始化变量 total 和 matching_list,其 total 用于记录匹配对数,matching_list 用于存储匹配对的索引。 使用 arange 函数生成一个包含 num_imgs 个元素的数组 ar。 开始循环,对于每个图像,先获取其对应的掩码,得到所有与其距离小于等于 sim_th 的图像的索引 to_match。如果 to_match 数量小于 min_pairs,则选择与当前图像距离最近的 min_pairs 个图像进行匹配。 然后,对于每个匹配对 (st_idx, idx),如果 st_idx 不等于 idx,且它们之间的距离小于 1000,就将其加入 matching_list,同时增加 total 的值。 最后,将 matching_list 去重并排序,得到最终的匹配对列表,并返回它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值