Всегда ли управляемая память CUDA копируется обратно на хост перед выполнением ядра?

Я работаю в групповом проекте, который выполняет параллельную обработку данных треугольника. Программа взаимодействует с внешним API, который может добавлять новые полигоны, удалять их или обновлять матрицы преобразования (аналогично тому, как работают графические движки). Мы запускаем серию ядер, которые выполняют обработку. Однако ни одно из ядер не модифицирует входные данные треугольника. Отдельный банк памяти инициализируется и используется для вывода. Этот блок памяти доступен хосту.

Кроме того, мы не ожидаем частого обновления данных треугольника по сравнению с количеством итераций нашего цикла выполнения. В настоящее время мы не используем функции унифицированной памяти CUDA, вся наша память выделяется и освобождается вручную с использованием cudaMalloc & cudaFree,

Мы обсуждаем, следует ли перейти к модели унифицированной памяти и выделить нашу память как управляемую память. Однако мы не уверены, как это повлияет на наше время выполнения.

В качестве обзора, вот как выглядит наша обработка:

Triangle * tris;
cudaMalloc(&tris, numTris * sizeof(tris)); // <--considering changing this to cudaMallocManaged.
DataOut * dataOut;
cudaMalloc(&dataOut, numTris * sizeof(DataOut)); // <--considering changing this to cudaMallocManaged.

// Copy triangle data here.

while(!quit) {
if(update) {
// If triangles added/removed, memory is reallocated and filled here by the host.
}
kernel1<<<numBlocks, blockSize>>>(tris, dataOut);
kernel2<<<numBlocks, blockSize>>>(tris, dataOut);
//etc...
cudaDeviceSynchronize();
//Now we copy the output data back to host for further processing.

}

cudaFree(triangles);
cudaFree(dataOut);

Я считаю, что переход на использование унифицированной памяти не должен приводить к снижению производительности по сравнению с нашей текущей реализацией, так как наши ядра никогда не изменяют данные треугольника, и хост никогда не получит доступ к треугольнику или массиву выходных данных во время выполнения ядер. Несмотря на то, что хост получает доступ к выходным данным, мы в настоящее время вручную копируем их обратно. Мой коллега полагает, что система единой системы обмена сообщениями будет копировать данные треугольника обратно на устройство перед каждым выполнением ядра, независимо от того, был ли к ним обращен хост, или нет, что влечет за собой значительные потери времени выполнения. Это правда? Можно ли при выделении управляемой памяти указывать объект, в котором мы бы предпочли, чтобы данные находились (в нашем случае, графический процессор)?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]