小编the*_*ush的帖子

Cuda - 从设备全局内存复制到纹理内存

我正在尝试使用Cuda和C++在GPU上执行两个任务(分成2个内核).作为输入,我采用NxM矩阵(作为浮点数组存储在主机的内存中).然后,我将使用对此矩阵执行某些操作的内核使其成为NxMxD矩阵.然后我有一个第二个内核,它对这个3D矩阵执行一些操作(我只是读取值,我不必为其写入值).

在纹理内存中运行似乎对我的任务来说要快得多,所以我的问题是如果可以在内核1之后从设备上的全局内存中复制我的数据并将其直接传输到内核2的纹理内存而不将其带回主机?

UPDATE

我添加了一些代码来更好地说明我的问题.

这是两个内核.第一个只是现在的占位符,并将2D矩阵复制为3D.

__global__ void computeFeatureVector(float* imData3D_dev, int imX, int imY, int imZ) {

//calculate each thread global index  
int xindex=blockIdx.x*blockDim.x+threadIdx.x; 
int yindex=blockIdx.y*blockDim.y+threadIdx.y;     

#pragma unroll
for (int z=0; z<imZ; z++) { 
    imData3D_dev[xindex+yindex*imX + z*imX*imY] = tex2D(texImIp,xindex,yindex);
}
}
Run Code Online (Sandbox Code Playgroud)

第二个将采用这个3D矩阵,现在表示为纹理并对其执行一些操作.现在空白.

__global__ void kernel2(float* resData_dev, int imX) {
//calculate each thread global index  
int xindex=blockIdx.x*blockDim.x+threadIdx.x; 
int yindex=blockIdx.y*blockDim.y+threadIdx.y;     

resData_dev[xindex+yindex*imX] = tex3D(texImIp3D,xindex,yindex, 0);

return; 
} 
Run Code Online (Sandbox Code Playgroud)

然后代码的主体如下:

// declare textures
texture<float,2,cudaReadModeElementType> texImIp; 
texture<float,3,cudaReadModeElementType> texImIp3D; 

void main_fun() {

// constants
int imX = 1024; …
Run Code Online (Sandbox Code Playgroud)

c++ memory textures cuda

6
推荐指数
1
解决办法
4799
查看次数

标签 统计

c++ ×1

cuda ×1

memory ×1

textures ×1