我正在尝试使用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)