cuda shared(共享内存)—一个容易错误的点
来源:互联网 发布:linux下创建用户 编辑:程序博客网 时间:2024/06/06 02:57
可能出现的代码情况:
template<int COL_NUM>
__global__ void kCopy(int row_size, float **col_valuess, float *row_values) {
int row_index = blockIdx.x * blockDim.x + threadIdx.x;
if (row_index >= row_size) return;
volatile __shared__ float* shared_col_valuess[COL_NUM];
int col_index = threadIdx.x;
if (col_index < COL_NUM) shared_col_valuess[col_index] = col_valuess[col_index];
__syncthreads();
float row_value = 0.0f;
#pragma unroll
for (int col_index = 0; col_index < COL_NUM; col_index++) {
row_value += shared_col_simss[col_index][row_index];
}
row_values[row_index] = row_value;
}
不知道是否有看出问题所在:
其实问题在于位置顺序:
1.先判断row_index是否有效
2.将col_valuess地址进行共享内存缓存
3.按row进行值
问题在于1中如果出现threadIdx.x < COL_NUM, 但是其blockIdx.x * blockDim.x + threadIdx.x >= row_size时,
会导致有一部分的地址没有被缓存到共享内存中,
这样在3进行计算的时候,某一列col的地址会无法访问,导致bug错误因此正确,应该先缓存地址到共享内存中
template<int COL_NUM>
__global__ void kCopy(int row_size, float **col_valuess, float *row_values) {
volatile __shared__ float* shared_col_valuess[COL_NUM];
int col_index = threadIdx.x;
if (col_index < COL_NUM) shared_col_valuess[col_index] = col_valuess[col_index];
__syncthreads();
int row_index = blockIdx.x * blockDim.x + threadIdx.x;
if (row_index >= row_size) return;
float row_value = 0.0f;
#pragma unroll
for (int col_index = 0; col_index < COL_NUM; col_index++) {
row_value += shared_col_simss[col_index][row_index];
}
row_values[row_index] = row_value;
}
因此,建议:
在使用共享内存的时候,
因保证共享内存前面的各个线程不会因某些条件而加快退出
如果存在加快退出的线程,应该将缓存地址到共享内存的操作提前
- cuda shared(共享内存)—一个容易错误的点
- cuda编程:关于共享内存(shared memory)和存储体(bank)的事实和疑惑
- CUDA 共享内存的动态分配
- 【并行计算-CUDA开发】关于共享内存(shared memory)和存储体(bank)的事实和疑惑
- 共享内存——The Shared memory
- 内存共享(Shared Memory)
- 共享内存: Shared Memory
- 容易错误的一个初始化
- [CUDA]共享内存
- CUDA总结:共享内存
- cuda共享内存,全局内存,纹理等的解释
- 动态内存管理容易出的错误
- ipc 共享内存 shared memmory
- 使用 libevent 容易犯的一个错误
- 一个比较容易忽略的错误
- Coldfusion一个容易犯的错误。
- 一个java继承容易犯的错误
- 指针赋值容易犯的一个错误
- #1141 : 二分·归并排序之逆序对
- pat 甲级 1126. Eulerian Path java实现
- PHP GPG 加密实践
- Laravel 发送邮件(smtp方式最简单的讲解!)-邮件部分
- Android开发中的一些问题小计1(读写数据)
- cuda shared(共享内存)—一个容易错误的点
- 程序编译链接感触
- iOS上传App Store报错:this action cannot be completed -22421 解决方案
- 1131. Subway Map (30)
- leetcode 413. Arithmetic Slices
- 【实用】教你如何改造 zblog MIP 模板
- windows编程 控制台程序闪退,一闪而退 怎么处理 处理办法
- String.format的用法(字符串格式化)
- 内核中架构相关代码简介