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

Кажется, что большинство учебников, руководств, книг и Q&А из Интернета относится к 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. Я не помещал это здесь для читабельности кода.

0

Решение

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

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

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

1

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

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

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