CUDA - отделение кода процессора от кода cuda - PullRequest
0 голосов
/ 23 ноября 2018

Искал использовать системные функции (такие как rand ()) в ядре CUDA.Тем не менее, в идеале это будет работать только на процессоре.Могу ли я разделять файлы (.cu и .c ++), все еще используя добавление матрицы gpu?Например, что-то вроде этого:

в main.cpp:

int main(){
std::vector<int> myVec;
srand(time(NULL));

for (int i = 0; i < 1024; i++){
    myvec.push_back( rand()%26);
}

selfSquare(myVec, 1024);

}

и в cudaFuncs.cu:

__global__ void selfSquare_cu(int *arr, n){
    int i = threadIdx.x;
    if (i < n){
        arr[i] = arr[i] * arr[i];
    }

}

void selfSquare(std::vector<int> arr, int n){
    int *cuArr;
    cudaMallocManaged(&cuArr, n * sizeof(int));
    for (int i = 0; i < n; i++){
        cuArr[i] = arr[i];
    }

    selfSquare_cu<<1, n>>(cuArr, n);
}

Каковы лучшие практики в таких ситуациях?Было бы лучше использовать curand и писать все в ядре?Мне кажется, как в приведенном выше примере, есть дополнительный шаг в получении вектора и копировании его в общую память CUDA.

1 Ответ

0 голосов
/ 23 ноября 2018

В этом случае единственное, что вам нужно, это инициализировать массив случайными значениями.Каждое значение массива может быть инициализировано независимо.Процессор участвует в вашем коде во время инициализации и передачи данных на устройство и обратно на хост.

В вашем случае вам действительно нужен процессор для инициализации данных, чтобы затем иметь всеэти значения перемещены в графический процессор?

Лучший подход - выделить некоторую память устройства и затем инициализировать значения с помощью ядра.Это сэкономит время, поскольку

  • Элементы инициализируются параллельно
  • Не требуется перенос памяти с хоста на устройство

Как правило, всегда избегайте связи между хостом и устройством, если это возможно .

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