启动CUDA内核序列并在它们之间进行数据传输
我有两个内核在同一个文件中,代码应该运行第一个内核来生成一个数组。然后我需要将生成的数组发送到第二个内核。 但是,当我这样做时,第二个内核看到所有数组元素都是0 这里是简化(不是可运行的代码)只是一个psyducode启动CUDA内核序列并在它们之间进行数据传输,cuda,Cuda,我有两个内核在同一个文件中,代码应该运行第一个内核来生成一个数组。然后我需要将生成的数组发送到第二个内核。 但是,当我这样做时,第二个内核看到所有数组元素都是0 这里是简化(不是可运行的代码)只是一个psyducode cudaMalloc(device input array) cudaMalloc(result array) cudaMemcpy(device_input_array,inputarray,size,hosttodevice) kernel1<&
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)
无论哪种情况,都不要将中间结果复制到主机(除非您出于其他原因确实需要它)。主机设备拷贝很昂贵