-3
我有一個大小爲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));
說真的,我給了你一個完整的工作示例,說明如何在回答最後一個問題時做到這一點。給我一個很好的理由,爲什麼我應該把它作爲你昨天的問題的一個重複來解決? – talonmies
這不是同一個問題,昨天的例子實際上運行良好,這裏的問題不在配置中,但事實上,這使得一個SIGSEGV ......我不太瞭解......我很抱歉...我在昨天的例子 – Cordaz
的想法做了這個,我什至不知道你想做什麼。這似乎很清楚你打算'gpu_hashed_spectrum'是一個指針指針,因爲你正在爲'uint64_t *'分配空間(這看起來好像你正在嘗試做一個深層拷貝......)但爲什麼你將它聲明爲單個指針?你實際上是在嘗試做一個深層複製,其中每個指針只指向*一個*數據項,就像循環的'cudaMemcpy'操作所暗示的那樣('sizeof(uint64_t)')。爲什麼要這麼做? –