我已经被这个错误困扰了很长一段时间所以我决定在这里发布它.
调用cudaMemcpy时发生此分段错误:
CurrentGrid->cdata[i] = new float[size];
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\
cudaMemcpyDeviceToHost);
Run Code Online (Sandbox Code Playgroud)
CurrentGrid
并且Grid_dev
分别指向grid
主机和设备上的类对象,在此上下文中i = 0.类成员cdata
是一个浮点类型指针数组.为了调试,这cudaMemcpy调用之前对的,我打印出来的每个元素的值Grid_Dev->cdata[i]
,地址CurrentGrid->cdata[i]
和Grid_dev->cdata[i]
和的价值size
,这一切看起来不错.但它仍然以"分段故障(核心转储)"结束,这是唯一的错误消息.cuda-memcheck只给出了"进程没有成功终止".我目前无法使用cuda-gdb.关于去哪儿的任何建议?
更新:现在看来我已经通过cudaMalloc解决了这个问题,设备上的另一个浮点指针A和cudaMemcpy的Grid_dev-> cdata [i]的值为A,然后是cudaMemcpy A来主机.所以上面写的代码段变成:
float * A;
cudaMalloc((void**)&A, sizeof(float));
...
...
cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost);
CurrentGrid->cdata[i] = new float[size];
cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost);
Run Code Online (Sandbox Code Playgroud)
我之所以这样做是因为valgrind突然出现了"8号无效读取",我认为这是指的Grid_dev->cdata[i]
.我用gdb再次检查它,打印出Grid_dev->cdata[i]
NULL值.所以我想即使在这个cudaMemcpy调用中也无法直接取消引用设备指针.但为什么 ?根据这个帖子底部的评论,我们应该能够在cudaMemcpy函数中取消引用设备指针.
另外,我不知道cudaMalloc和cudaMemcpy如何工作的基本机制,但我认为cudaMalloc是一个指针,比如A,我们实际上指定这个指针指向设备上的某个地址.并且通过cudaMemcpy Grid_dev->cdata[i]
到A,如上面的修改代码,我们重新分配指针A指向数组.那么,当它是cudaMalloced时,我们不会失去A指向的先前地址的轨道吗?这会导致内存泄漏吗?如果是的话,我应该如何妥善解决这种情况?谢谢!
作为参考,我将完整函数的代码放在下面发生此错误的代码中.
非常感谢!
__global__ void Print(grid *, int);
__global__ void Printcell(grid *, int);
void CopyDataToHost(param_t p, grid …
Run Code Online (Sandbox Code Playgroud) 为了测试设备上的printf()调用,我写了一个简单的程序,它将一个中等大小的数组复制到设备并将设备数组的值打印到屏幕上.尽管数组已正确复制到设备,但printf()函数无法正常工作,这会丢失前几百个数字.代码中的数组大小是4096.这是一个错误还是我没有正确使用此功能?谢谢你的意见.
编辑:我的gpu是GeForce GTX 550i,具有2.1的计算能力
我的代码:
#include<stdio.h>
#include<stdlib.h>
#define N 4096
__global__ void Printcell(float *d_Array , int n){
int k = 0;
printf("\n=========== data of d_Array on device==============\n");
for( k = 0; k < n; k++ ){
printf("%f ", d_Array[k]);
if((k+1)%6 == 0) printf("\n");
}
printf("\n\nTotally %d elements has been printed", k);
}
int main(){
int i =0;
float Array[N] = {0}, rArray[N] = {0};
float *d_Array;
for(i=0;i<N;i++)
Array[i] = i;
cudaMalloc((void**)&d_Array, N*sizeof(float));
cudaMemcpy(d_Array, Array, N*sizeof(float), cudaMemcpyHostToDevice);
cudaDeviceSynchronize();
Printcell<<<1,1>>>(d_Array, N); //Print …
Run Code Online (Sandbox Code Playgroud) 所以我需要使用 mpi4py 来运行模块。手动安装mpi4py后,通过.pythonrc中的命令将mpi4py包的路径添加到python搜索路径中sys.path.append()
。我尝试在解释器中导入 mpi4py,无论在何处调用解释器,它都可以正常工作:
$ python
Python 2.7.4 (default, May 23 2013, 17:15:02)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mpi4py import MPI
>>> MPI
<module 'mpi4py.MPI' from '/home/XXXX/yt-x86_64/src/mpi4py-1.3/build/lib.linux-x86_64-2.7/mpi4py/MPI.so'>
Run Code Online (Sandbox Code Playgroud)
然后我尝试从命令行运行一个包含from mpi4py import MPI
. 它找不到模块:
$ python run_rockstar2.py
Traceback (most recent call last):
File "run_rockstar2.py", line 1, in <module>
from mpi4py import MPI
ImportError: No module named mpi4py
Run Code Online (Sandbox Code Playgroud)
我检查过在这两种情况下我使用的是相同的 python。有人对此有任何线索吗?
提前致谢。
我在一个GPU上运行这个程序,全局内存为1GB.它给出了以下错误:
Fatal error: cudaMemcpy1 error (unspecified launch failure at CheckDevice.cu:27)
*** FAILED - ABORTING
========= Out-of-range Shared or Local Address
========= at 0x000006a8 in grid::SetSubgridMarker(grid*, grid*)
========= by thread (0,0,0) in block (0,0,0)
========= Device Frame:SetAllFlags_dev(param_t*, grid*) (SetAllFlags_dev(param_t*, grid*) : 0x108)
========= Device Frame:SetAllFlags(param_t*, grid*) (SetAllFlags(param_t*, grid*) : 0x38)
========= Saved host backtrace up to driver entry point at kernel launch time
========= Host Frame:/usr/lib/libcuda.so (cuLaunchKernel + 0x3dc) [0xc9edc]
========= Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 [0xa18a]
========= Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaLaunch + 0x17f) [0x2f4cf] …
Run Code Online (Sandbox Code Playgroud)