在CUDA分配中的SIGSEGV
问题描述:
我有一个大小为spectrum_size
的uint64_t
的主机阵列,我需要分配并将其复制到我的GPU上。 但是,当我试图在GPU内存中分配这个,但我继续收到SIGSEGV ...任何想法?在CUDA分配中的SIGSEGV
uint64_t * gpu_hashed_spectrum;
uint64_t * gpu_hashed_spectrum_h = new uint64_t [spectrum_size];
HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t *) * spectrum_size));
for(i=0; i<spectrum_size; i++) {
HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum_h[i], sizeof(uint64_t)));
}
printf("\t\t...Copying\n");
for(i=0; i<spectrum_size; i++) {
HANDLE_ERROR(cudaMemcpy((void *)gpu_hashed_spectrum_h[i], (const void *)hashed_spectrum[i], sizeof(uint64_t), cudaMemcpyHostToDevice));
}
HANDLE_ERROR(cudaMemcpy(gpu_hashed_spectrum, gpu_hashed_spectrum_h, spectrum_size * sizeof(uint64_t *), cudaMemcpyHostToDevice));
的完整代码可以here
UPDATE:
我想用这种方式做,诺伊我有SIGSEGV的代码的其他部分(在内核中,使用这种阵列时也许是由于其他错误。
uint64_t * gpu_hashed_spectrum;
HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t) * spectrum_size));
HANDLE_ERROR(cudaMemcpy(gpu_hashed_spectrum, hashed_spectrum, spectrum_size * sizeof(uint64_t), cudaMemcpyHostToDevice));
答
至少你感到困惑uint64_t**
和unit64_t*
。
在第1行中,将定义gpu_hashed_spectrum
作为指针,指向型unit64_t
的一些数据,但在第3行
HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t *) * spectrum_size));
使用gpu_hashed_spectrum
作为一个指针,指向型unit64_t*
的一些数据。
也许你应该你的定义修改为
uint64_t** gpu_hashed_spectrum;
以及一些其他行。
说真的,我给了你一个完整的工作示例,说明如何在回答最后一个问题时做到这一点。给我一个很好的理由,为什么我应该把它作为你昨天的问题的一个重复来解决? – talonmies
这不是同一个问题,昨天的例子实际上运行良好,这里的问题不在配置中,但事实上,这使得一个SIGSEGV ......我不太了解......我很抱歉...我在昨天的例子 – Cordaz
的想法做了这个,我什至不知道你想做什么。这似乎很清楚你打算'gpu_hashed_spectrum'是一个指针指针,因为你正在为'uint64_t *'分配空间(这看起来好像你正在尝试做一个深层拷贝......)但为什么你将它声明为单个指针?你实际上是在尝试做一个深层复制,其中每个指针只指向*一个*数据项,就像循环的'cudaMemcpy'操作所暗示的那样('sizeof(uint64_t)')。为什么要这么做? –