Управление контекстом CUDA 5.0 с одним потоком приложения в среде с несколькими графическими процессорами

Похоже, что большинство учебных пособий, руководств, книг и вопросов и ответов из Интернета относятся к CUDA 3 и 4.x, поэтому я спрашиваю об этом конкретно о CUDA 5.0. На вопрос...

Я хотел бы программировать для среды с двумя устройствами CUDA, но использовать только один поток, чтобы сделать дизайн простым (особенно потому, что это прототип). Я хочу знать, допустим ли следующий код:

float *x[2];
float *dev_x[2];

for(int d = 0; d < 2; d++) {
    cudaSetDevice(d);
    cudaMalloc(&dev_x[d], 1024);
}

for(int repeats = 0; repeats < 100; repeats++) {
    for(int d = 0; d < 2; d++) {
        cudaSetDevice(d);
        cudaMemcpy(dev_x[d],x[d],1024,cudaMemcpyHostToDevice);

        some_kernel<<<...>>>(dev_x[d]);

        cudaMemcpy(x[d],dev_x[d],1024,cudaMemcpyDeviceToHost);
    }
    cudaStreamSynchronize(0);
}

Я хотел бы знать конкретно, если cudaMalloc(...)до проверки на сохранность даже при замене cudaSetDevice() это происходит в той же теме. Кроме того, я хотел бы знать, происходит ли то же самое с контекстно-зависимыми объектами, такими как cudaEvent_t а также cudaStream_t,

Я спрашиваю об этом, потому что у меня есть приложение в этом стиле, которое продолжает получать некоторую ошибку отображения, и я не могу найти, что это, если какая-то утечка памяти или использование API неправильно.

Примечание. В моем исходном коде я проверяю каждый вызов CUDA. Я не помещал это здесь для читабельности кода.

1 ответ

Это просто опечатка?

for(int d = 0; d < 2; d++) {
    cudaSetDevice(0);  // shouldn't that be 'd'
    cudaMalloc(&dev_x, 1024);
}

Пожалуйста, проверьте возвращаемое значение всех вызовов API!

Другие вопросы по тегам