纹理内存
纹理内存可以加速应用主要原因有两方面:
-
纹理内存也是缓存在片上的,因此一些情况下相比从芯片外的DRAM上获取数据,纹理内存可以通过减少内存请求来提高带宽。
-
纹理内存是针对图形应用设计的,可以更高效地处理局部空间的内存访问。
-
从数学的角度,上图中的4个地址并非连续的,在一般的CPU缓存中,这些地址将不会缓存。但由于GPU纹理缓存是专门为了加速这种访问模式而设计的,因此如果在这种情况中使用纹理内存而不是全局内存,那么将会获得性能的提升。
这一段转自https://blog.csdn.net/shuzfan/article/details/77095270
热传导模型
// these exist on the GPU side
texture<float> texConstSrc;
texture<float> texIn;
texture<float> texOut;
HANDLE_ERROR( cudaMalloc( (void**)&data.dev_inSrc,
imageSize ) );
HANDLE_ERROR( cudaMalloc( (void**)&data.dev_outSrc,
imageSize ) );
HANDLE_ERROR( cudaMalloc( (void**)&data.dev_constSrc,
imageSize ) );
HANDLE_ERROR( cudaBindTexture( NULL, texConstSrc,
data.dev_constSrc,
imageSize ) );
HANDLE_ERROR( cudaBindTexture( NULL, texIn,
data.dev_inSrc,
imageSize ) );
HANDLE_ERROR( cudaBindTexture( NULL, texOut,
data.dev_outSrc,
imageSize ) );
算法分为三步:
- 首先,我们先强行把heater的温度覆盖到input上去,以保持heater温度不变的约束。这一部分在函数copy_const_kernel()中实现。首先定位当前格子在哪,然后如果在constant温度矩阵里这个格子不为0,那么我们就将constant的heater的温度给复制到当前的input中去,完成了约束的维护。
__global__ void copy_const_kernel( float *iptr,
const float *cptr ) {
// map from threadIdx/BlockIdx to pixel position
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
if (cptr[offset] != 0) iptr[offset] = cptr[offset];
}
- 根据温度传递更新公式,计算每个格子的温度,输出到output buffer。这一部分在 blend_kernel()中实现。在寻找每个格子周围inde