Кажется, что большинство учебников, руководств, книг и 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. Я не помещал это здесь для читабельности кода.
Это просто опечатка?
for(int d = 0; d < 2; d++) {
cudaSetDevice(0); // shouldn't that be 'd'
cudaMalloc(&dev_x, 1024);
}
Пожалуйста, проверьте возвращаемое значение всех вызовов API!
Других решений пока нет …