这里是我的代码:CUDA cudaMemcpy:无效的参数
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和S h [3],而不是在类中。更奇怪的是,我在一个小程序中实现了这个类A,它工作正常。 而我更新了我的驱动程序,错误仍然存在。
任何人都可以告诉我为什么会发生这种情况,以及如何解决它。谢谢。
顺便说一句,cudaMemcpy会reture cudaErrorInvalidValue。 – TonyLic
线路'A a;'在哪里?它是在一个函数内,还是全局的?如果它是全局的,那么在你有一个有效的设备上下文之前可能会调用构造函数(我不确定这一点,但这是可能的)。如果是这种情况,那么传递给cudaMemcpy的d指针将是无效的。 – harrism
你可以发布你使用的CUDA配置吗?我无法用旧版GeForce 9400m和CUDA 5.0预览版重现您的错误。 – jopasserat