Ошибка сегментации после второго cudaMalloc - PullRequest
0 голосов
/ 16 января 2019

Я получаю ошибку сегментации после второго cudaMalloc.

#include <cuda.h>
#include <cuda_runtime.h>

int main(){

  int n=16;

  float2* a;
  cudaMalloc((void **) a, n*sizeof(float2));
  float2* b;
  cudaMalloc((void **) b, n*sizeof(float2));

  return 0;
}

Однако, если я закомментирую какой-либо из 2-х cudaMalloc, код работает нормально.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Из-за испорченного CUDA API правильный ответ - написать обертку вокруг их корзины:

void* saneMalloc (size_t n)
{
  void* tmp;
  if (cudaMalloc(&tmp, n) == cudaSuccess)
    return tmp;
  return NULL;
}

...

float* a = saneMalloc(n);

Это необходимо сделать, потому что единственный общий тип указателя в C - void*.Вы можете конвертировать любой указатель на тип в void*, но это не применимо к void**.Поэтому, если у вас есть float, вы не можете передать float** функции, ожидающей void**.Это несовместимый тип указателя.

В частности, при передаче параметров в функцию они копируются в соответствии с правилами простого назначения (C17 6.5.16.1).Передача float** в функцию, ожидающую void**, является нарушением ограничения правила простого присваивания.Код не может быть скомпилирован правильно, так как это стандартное нарушение языка Си.

0 голосов
/ 16 января 2019

Вы должны передать указатель на указатель так:

float2* a;
cudaMalloc(&a, n*sizeof(float2));
float2* b;
cudaMalloc(&b, n*sizeof(float2));

в противном случае, вы просто приводите висячий указатель к «указателю на указатель», и библиотека разыменовывает адрес мусора, приводящий к segfault.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...