Указатель CUDA на нарушение доступа к указателю [дубликат]

Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.

Пример:

string postalcode=Customer.Address.PostalCode; 
//if customer or address is null , this will through exeption

здесь, если адрес имеет значение null, то вы получите NullReferenceException.

Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)

string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
4
задан 2 December 2009 в 21:21
поделиться

6 ответов

вы не можете использовать

cudaMalloc(&h_array[i], i * sizeof(void*));

для массива, объявленного как void *

, использовать определенный тип данных

CUdeviceptr *h_array = malloc(sizeof(CUdeviceptr *) * N);

или

int *h_array = malloc(sizeof(int *) * N);

и направить его на void *

cudaMalloc((void *)&h_array[i], i * sizeof(void*));
1
ответ дан axel22 1 September 2018 в 00:00
поделиться

У меня была та же проблема и мне удалось ее решить.

Ответ FabrizioM был хорошим моментом для меня и очень помог мне. Но тем не менее я столкнулся с некоторыми проблемами, когда пытался передать код в свой проект. Используя дополнительные комментарии и сообщения, я смог написать рабочий пример (VS2012, CUDA7.5). Таким образом, я отправлю свой код в качестве дополнительного ответа и отправлю его для других.

Чтобы понять именование: я использую вектор OpenCV cv :: Mat в качестве входных данных, которые записываются с нескольких камер и Я обрабатываю эти изображения в ядре.

     void TransferCameraImageToCuda(const std::vector<cv::Mat*>* Images)
{

     int NumberCams     = Images->size();
     int imageSize      = Images->at(0)->cols*Images->at(0)->rows;

     CUdeviceptr*           CamArraysAdressOnDevice_H;
     CUdeviceptr*           CamArraysAdressOnDevice_D;


         //allocate memory on host to store the device-address of each array
         CamArraysAdressOnDevice_H = new CUdeviceptr[NumberCams];

         // allocate memory on the device and store the arrays on the device 
         for (int i = 0; i < NumberCams; i++){
             cudaMalloc((void**)&(CamArraysAdressOnDevice_H[i]), imageSize * sizeof(unsigned short));
             cudaMemcpy((void*)CamArraysAdressOnDevice_H[i], Images->at(i)->data, imageSize * sizeof(unsigned short), cudaMemcpyHostToDevice);
         }

         // allocate memory on the device to store the device-adresses of the arrays
         cudaMalloc((void**)&CamArraysAdressOnDevice_D, sizeof(CUdeviceptr*)* NumberCams);

         // Copy the adress of each device array to the device
         cudaMemcpy(CamArraysAdressOnDevice_D, CamArraysAdressOnDevice_H, sizeof(CUdeviceptr*)* NumberCams, cudaMemcpyHostToDevice);




}

В запуске ядра я запускаю указатель устройства на указатель типа данных (unsigned short **)

DummyKernel<<<gridDim,blockDim>>>(NumberCams, (unsigned short**) CamArraysAdressOnDevice_D)

и определение ядра, например:

__global__ void DummyKernel(int NumberImages, unsigned short** CamImages)
{
    int someIndex = 3458;
    printf("Value Image 0 : %d \n", CamImages[0][someIndex]);
    printf("Value Image 1 : %d \n", CamImages[1][someIndex]);
    printf("Value Image 2 : %d \n", CamImages[2][someIndex]);
}
1
ответ дан Christian_B 1 September 2018 в 00:00
поделиться

Я не верю, что это поддерживается. cudaMalloc() выделяет память устройства, но сохраняет адрес в переменной на хосте. В вашем for-loop вы передаете его адреса в памяти устройства.

В зависимости от того, что вы пытаетесь выполнить, вы можете выделить data с обычным хостом malloc() перед вызовом for -Лоп, как у тебя сейчас. Или выделите один большой блок памяти устройства и вычислите смещения в нем вручную.

Посмотрите на разделы 2.4, 3.2.1 и B.2.5 (внизу) руководства по программированию CUDA для более подробного обсуждения этого. В частности, в нижней части страницы 108:

Адрес, полученный с помощью адреса переменной __device__, __shared__ или __constant__, может использоваться только в коде устройства.

4
ответ дан Gabriel 1 September 2018 в 00:00
поделиться
  • 1
    Это верно. Указатель, выделенный cudaMalloc, должен находиться в памяти хоста, и вы пытаетесь сохранить эти указатели в памяти устройства. Вместо этого вы должны создать массив указателей на хосте, а затем скопировать его на устройство в конце или просто вычислить смещения, как предлагает Габриэль. – Tom 4 December 2009 в 11:42

Я думаю, что в первом цикле он должен быть &h_array[i] не &d_array[i].

2
ответ дан Jamshidi 1 September 2018 в 00:00
поделиться

Похожие темы на nvidia forums - http://forums.nvidia.com/index.php?showtopic=69403&st=20

1
ответ дан Sayan 1 September 2018 в 00:00
поделиться
10
ответ дан Vicente Oyanedel 1 September 2018 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: