我写了一个Cuda应用程序,我需要计算许多图像子区域的像素总和。到目前为止,我只使用全局内存,现在我正在尝试使用纹理内存。
因此,从硬盘驱动器读取的图像存储在具有以下格式的1D阵列中:
像素 [0.0] 蓝色,像素 [0.0] 绿色,像素 [0.0] 红色,< / p>
像素 [0.1] 蓝色,像素 [0.1] 绿色,像素 [0.1] 红色,< / p>
像素 [0.2] 蓝色,像素 [0.2] 绿色,像素 [0.2] 红色,< / p>
.................,
像素 [0.(宽度-1)] 蓝色,像素 [0.(宽度-1)] 绿色,像素 [ 0.(宽度-1)] 红色,
像素 [1.0] 蓝色,像素 [1.0] 绿色,像素 [1.0] 红色,< / p>
像素 [1.1] 蓝色,像素 [1.1] 绿色,像素 [1.1] 红色,< / p>
像素 [1.2] 蓝色,像素 [1.2] 绿色,像素 [1.2] 红色,< / p>
.................,
请注意,每个值都是unsigned char
我的问题是,如果有一种方法可以使用纹理内存来有效地访问这些值并创建子图像的总和:
[ 0 . 0 ].................[ 0 . n ] | [ 0 .(n+1)].................[ 0 .(2*n)]
|
|
sub-image 0 | sub-image 1
|
|
[ m . 0 ].................[ m . n ] | [ m .(n+1)].................[ m .(2*n)]
--------------------------------------------------------------------------------
[(m+1).0].................[(m+1).n] | [ 0 .(n+1)].................[(m+1).(2*n)]
|
|
sub-image 2 | sub-image 3
|
|
[(2*m).0].................[(2*m).n] | [(2*m).(n+1)].................[(2*m).(2*n)]
有没有人对哪个是最好的方法有任何意见?
总之,我想取代这种全球访问
和= hole_image [threadIdx.x];
具有纹理访问权限,当threadIdx.x大于n时,则hole_image的下一个值将是子图像下一行的第一个值?我问,因为我在MPI中看到过类似的东西。
编辑:我想到的是一个使用类似&lt; uchar3&gt;但纹理内存不支持此类型。我设法用3D纹理处理图像。但我想我仍然遗漏了一些东西。我认为有一种方法可以处理我的图像2D纹理。