菜鸟问题多.
我之前的实现是: 在GPU设备上全局存储器上创建一个3D的线性内存,并且在kernel计算中给这个3D线性内存的每个元素赋值,然后再绑定到纹理存储器。即整个过程不用从CPUcopy数据给GPU。
如果我现在改为使用3DCuda数组,在GPU端的全局存储器创建cuda数组,我还能先在kernel里直接对全局存储器中的cuda数组赋值,然后再绑定到纹理存储器吗?是不是cuda数组在GPU全局存储器上不能被写?GPU端只能写全局存储器中的线性数组,然后再在GPU端把全局存储器中的线性数组拷贝给全局存储器端的cuda数组?
谢谢。
我看到sdk里的示例都是直接从host端赋值给device端的cuda数组,难道不能直接在device端直接复制吗?
那么我最优的策略难道是在device端建一个线性数组和一个cuda array。然后先把计算结果写入线性数组,再拷贝的cuda array吗?
是不是我线性数组建立的3D数组被绑定到纹理后,访问某个像素后,缓存不会cache他周围的像素?只有cuda array会缓存?
由于3D数组中的元素是在GPU上计算赋值的,如果用cuda array的话意味着:
因为cudaArray不能在device被赋值,先要将device中的数组的计算结果写回host,再从host写入device的cuda array,再绑定3D纹理缓存。开销貌似太大。
1)是不是只有cudaArray建立的3D数组绑定到3D纹理,当访问其中某个元素是,上下左右前后的像素才会被cache到?
2)线性输入如何绑定到3D纹理,即cudaMemset3D创建的cudaPitchedPtr可否绑定到3D纹理?
http://cuda.itpub.net/thread-1317563-1-1.html