cudaMemcpyDeviceToHost() не работает

119
14

У меня есть следующий код (предположим, что все определено правильно):

#include "OurIncludes.h"
#include <ctime>

__global__ void kernel_testing(int *d_intersects, Circle *part1, Circle *part2)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
if (i < 10 && j < 10) {
int index = i + j * 10;
d_intersects[index] = part1[i].intersect(part2[j]);
}
}

int main(void)
{
dim3 GRID(1, 1);
dim3 BLOCK(10, 10);

short randomNum;
RandObj randGenerator;
Circle* obj = new Circle[10];
Circle* obj2 = new Circle[10];
Circle *d_obj;
Circle *d_obj2;
int intersects[100];
int *d_intersects;

if (cudaSuccess != cudaMalloc((void **)&d_obj, sizeof(Circle) * 10)) {
fprintf(stderr, "Failed to allocate memory for d_result\n");
}
if (cudaSuccess != cudaMalloc((void **)&d_obj2, sizeof(Circle) * 10)) {
fprintf(stderr, "Failed to allocate memory for d_result\n");
}
if (cudaSuccess != cudaMalloc((void **)&d_intersects, sizeof(int) * 100)) {
fprintf(stderr, "Failed to allocate memory for d_result\n");
}
for (int i = 0; i < 10; i++) {
obj[i] = (*randGenerator.makeRandomCircle());
}

for (int i = 0; i < 10; i++) {
obj2[i] = (*randGenerator.makeRandomCircle());
}
size_t size = sizeof(Circle);
if (cudaSuccess != cudaMemcpy(d_obj, obj, size * 10, cudaMemcpyHostToDevice)) {
fprintf(stderr, "Failed to copy data to d_obj\n");
}
if (cudaSuccess != cudaMemcpy(d_obj2, obj2, size * 10, cudaMemcpyHostToDevice)) {
fprintf(stderr, "Failed to copy data to d_obj2\n");
}

kernel_testing << < GRID, BLOCK >> >(d_intersects, d_obj, d_obj2);

cudaError_t s = cudaMemcpy(intersects, d_intersects, sizeof(int) * 100, cudaMemcpyDeviceToHost);
fprintf(stderr, "Error is: %s", cudaGetErrorString(s));
cudaFree(d_intersects);
cudaFree(d_obj);
cudaFree(d_obj2);
return 0;
}

По какой-то причине код всегда терпит неудачу в cudaMemcpyDeviceToHost, и я не вижу причины, почему он должен. Я пробовал запуск с различными объектами (треугольники, сферы и т.д.), Но он всегда терпит неудачу, когда мне нужно скопировать данные с устройства на хост. Любая помощь и/или предложение приветствуются, я очень новичок в программировании с использованием CUDA. Благодарю.

EDIT: Код ошибки говорит о том, что был обнаружен незаконный доступ к памяти, но я не понимаю, почему это должно произойти.

EDIT 2: Итак, я удалил все двойные указатели и "сплющил" свои массивы, но у меня все еще такая же проблема. Теперь я совершенно не в курсе.

спросил(а) 2021-01-19T19:38:51+03:00 6 месяцев назад
1
1 ответ
-6

Я думаю, что однажды я столкнулся с такой проблемой, мое решение было:

cudaError_t status = cudaMemcpy(devPtr, srcPtr, size * sizeof(int), cudaMemcpyHostToDevice);
if (status == cudaSuccess) { ... }

Попробуйте не сравнивать fuction с cudaSuccess напрямую, а через переменную.

ответил(а) 2021-01-19T19:38:51+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема