Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
启动CUDA内核序列并在它们之间进行数据传输_Cuda - Fatal编程技术网

启动CUDA内核序列并在它们之间进行数据传输

启动CUDA内核序列并在它们之间进行数据传输,cuda,Cuda,我有两个内核在同一个文件中,代码应该运行第一个内核来生成一个数组。然后我需要将生成的数组发送到第二个内核。 但是,当我这样做时,第二个内核看到所有数组元素都是0 这里是简化(不是可运行的代码)只是一个psyducode cudaMalloc(device input array) cudaMalloc(result array) cudaMemcpy(device_input_array,inputarray,size,hosttodevice) kernel1<&

我有两个内核在同一个文件中,代码应该运行第一个内核来生成一个数组。然后我需要将生成的数组发送到第二个内核。 但是,当我这样做时,第二个内核看到所有数组元素都是0

这里是简化(不是可运行的代码)只是一个psyducode

 cudaMalloc(device input array)
 cudaMalloc(result array)    
 cudaMemcpy(device_input_array,inputarray,size,hosttodevice)    
 kernel1<<<1,n>>(device_input_array,device_result_array)
 cudaMemcpy(host_result_array,device_result_array ... )     
 cudaMalloc(dev_secndarray)    
 kernel2<<<1,n>>>(dev_secndarray,device_result_array )
cudamaloc(设备输入阵列)
Cudamaloc(结果数组)
cudaMemcpy(设备\输入\阵列、输入阵列、大小、主机设备)

内核1通过
cudamaloc
分配的内存一直存在,直到应用程序结束,或者直到您显式释放内存。因此,
设备\u结果\u数组
可以作为输入直接传递给第二个内核。我建议采用以下模式:

cudaMalloc(device_input_array)
cudaMalloc(device_intermediate_result_array)
cudaMalloc(device_final_result_array)
cudaMemcpy(device_input_array,host_input_array,size,hosttodevice) 
kernel1<<<G,B>>>(device_input_array,device_intermediate_result_array)
kernel2<<<G,B>>>(device_intermediate_result_array,device_final_result_array)
cudaMemcpy(host_result_array,device_final_result_array,size,devicetohost)
cudamaloc(设备输入阵列)
cudaMalloc(设备\中间\结果\阵列)
Cudamaloc(设备\最终\结果\阵列)
cudaMemcpy(设备输入阵列、主机输入阵列、大小、主机设备)
内核1(设备\输入\数组、设备\中间\结果\数组)
内核2(设备\中间\结果\数组、设备\最终\结果\数组)
cudaMemcpy(主机结果数组、设备最终结果数组、大小、设备主机)
如果出于某种原因,您确实需要在设备中复制中间结果,您可以选择调用
cudaMemcpy(…,cudaMemcpyDeviceToDevice)

无论哪种情况,都不要将中间结果复制到主机(除非您出于其他原因确实需要它)。主机设备拷贝很昂贵