2017-02-18 4 views
-2

У меня есть два ядра в одном файле, код должен запускать первое ядро ​​для генерации массива. то мне нужно отправить сгенерированный массив во второе ядро. Однако, когда я делаю это, второе ядро ​​видит, что все элементы массива равны 0.Запуск последовательности ядер CUDA и передача данных между ними

здесь упрощение (а не исполняемый код) просто 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) 

для тестирования .. в kernel2 я создать петлю на device_result_array, как всегда печатает все ее элементы как ноль.

Что такое правильный способ отправки данных между ядрами. Должен ли я зарезервировать место для массива результатов снова? что мне делать?

ответ

0

Память, выделенная через cudaMalloc, существует до конца приложения или пока вы явно не освободите память. Таким образом, device_result_array может быть передан непосредственно ко второму ядру в качестве входа. Я бы рекомендовал следующую картину:

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) 

Если по какой-то причине вы на самом деле нужно, чтобы сделать копию промежуточного результата в устройстве, у вас есть возможность позвонить cudaMemcpy(...,cudaMemcpyDeviceToDevice).

В любом случае не копируйте промежуточный результат на хост (если только он не нужен по другим причинам). Хост < -> Аппаратные копии стоят дорого.

Смежные вопросы