2016-05-24 2 views
0

Давайте скажем, что я построил внутри ядро, где я выполнил некоторые вычисления. Затем я хочу вернуть эту переменную, однако они не были отправлены в качестве указателей, когда я инициализировал ядро, поэтому, если я хочу вернуть это значение. Как я могу это сделать? Примеры кодов ниже.Как эффективно вернуть данные ядра malloc обратно в cpu

Я задаю это только как общий вопрос, чтобы не решить приведенный ниже код. У меня есть другие проблемы, когда я сталкиваюсь с этим, и я не знаю, как лучше всего это сделать. Я понимаю, что вы можете просто ввести указатель и скопировать результаты на него. Однако, если размер результата не предопределен, было бы очень сложно сделать это эффективно. Поэтому я спрашиваю, есть ли лучший способ.

__global__ void addKernel() 
{ 
    int* c = (int*)malloc(sizeof(int) * 32); 
#pragma unroll 
    for (int i = 0; i < 32; i++){ 
     c[i] += 1; 
    } 
} 

ответ

2

Указатели выделены с помощью выделения на стороне устройства (new, malloc или cudaMalloc) не может быть использована принимающими вызовов на стороне API. Таким образом, единственный способ перенести данные, хранящиеся в памяти, выделенные приложением для запуска устройства, - это скопировать его в ядро ​​в память, выделенную хостом, и передать в запущенное ядро.

Время работы устройства поддерживает как memcpy, так и cudaMemcpyAsync для копий устройств в память устройства. Я подозреваю, что это будут ваши лучшие варианты в этом случае. Вы должны тщательно изучить this section документации, чтобы вы поняли ограничения API-интерфейса времени выполнения.

+0

Я прочитал эту часть, но не был готов просто отказаться от этой идеи :) Я думал об использовании uva и заголовке, который указывает, были ли данные обработаны gpu и cpu, чтобы проверить, что место нахождения. Будет ли это хорошей идеей? Если вы хотите, чтобы я написал код, я сделаю это после моего дома. –

+0

Я думаю, вам следует предоставить дополнительную информацию о проблеме, которую вы пытаетесь решить. Существует множество различных стратегий, которые можно использовать для обработки ядер, которые выводят переменные объемы данных, для этого вам обычно не требуется malloc на стороне устройства. –

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