Вот мой код:
struct S {
int a, b;
float c, d;
};
class A {
private:
S* d;
S h[3];
public:
A() {
cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
}
void Init();
};
void A::Init() {
for (int i=0;i<3;i++) {
h[i].a = 0;
h[i].b = 1;
h[i].c = 2;
h[i].d = 3;
}
cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice));
}
A a;
На самом деле это сложная программа, содержащая CUDA и OpenGL. Когда я отлаживаю эту программу, она терпит неудачу при запуске cudaMemcpy с информацией об ошибке
cudaSafeCall() Ошибка API среды выполнения 11: недопустимый аргумент.
На самом деле эта программа преобразована из другой, которая может работать корректно. Но в этом случае я использовал две переменные S* d и Sh[3] в основной функции, а не в классе. Что еще более странно, так это то, что я реализую этот класс A в небольшой программе, и он отлично работает. И я обновил свой драйвер, ошибка все еще существует.
Может ли кто-нибудь подсказать, почему это происходит и как это решить. Спасибо.
A a;
? Это внутри функции или глобально? Если он глобальный, то конструктор может быть вызван до того, как у вас будет действительный контекст устройства (я не уверен в этом, но это возможно). Если это так, то указатель d, переданный cudaMemcpy, будет недействительным. - person harrism   schedule 29.05.2012