2016-11-14 5 views
0

Я искал, как создать массив указателей и скопировать его в память CUDA. Я нашел этот пост CUDA Double pointer memory copy но следующую строку в принятом ответеАдрес двойного указателя на void **

int ** devicePointersStoredInDeviceMemory; 
cudaMalloc((void**)&devicePointersStoredInDeviceMemory, sizeof(int*)*N); 

это подслушивание меня немного. В чем смысл передачи адреса двойного указателя и отбрасывания его на void**? Не было бы &devicePointerStoredInDeviceMemory так же, как int***, так зачем его отличать void** вместо void***?

Это работает, но я не понимаю, почему.

+1

Примечание: это неопределенное поведение в стандарте C++, но Windows API, опирается на него. –

ответ

1

В чем смысл передачи адреса двойного указателя и перевода его в пустоту **? Не было бы & devicePointerStoredInDeviceMemory будет таким же, как int ***, поэтому зачем применять его к void ** вместо void ***?

cudaMalloc функция принимает void ** в качестве первого параметра, так что если мы будем называть cudaMalloc, это тип нам нужно. Цель первого параметра - сообщить codaMalloc, где хранить указатель на выделенную память.

Вы могли бы сделать это так же хорошо:

void *j; 
cudaMalloc(&j, sizeof(int*)*N); // stores result in j 
int **devicePointersStoredInDeviceMemory = (int **) j; 
+0

О, я сейчас вижу. Итак, '(void **)' можно интерпретировать как «дать мне адрес переменной, которую вы хотите мне выделить»? Независимо от того, является ли это 'int *' или 'float **' или 'double *****', если это идея, я думаю, что получил ее благодаря – BRabbit27

+2

Я бы назвал ее «скажите мне, где хранить адрес память, которую я выделил для вас ». В этом случае мы хотим, чтобы память содержала указатели на целые числа, поэтому указатель на память, которая будет содержать указатели на целые числа, имеет тип 'int **'. –

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