我正在为使用Streams的GPU编写矩阵添加程序,显然是固定内存。所以我在固定内存中分配了3个矩阵,但在特定尺寸之后它显示API错误2:内存不足。我的RAM是4GB但我不是能够超过800MB使用。有什么方法可以控制这个上限? 我的sys配置: nVidia GEForce 9800GTX 英特尔酷睿2四核 对于流执行代码,如下所示
(int i=0;i<no_of_streams;i++)
{
cudaMemcpyAsync(device_a+i*(n/no_of_streams),hAligned_on_host_a+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyHostToDevice,streams[i]);
cudaMemcpyAsync(device_b+i*(n/no_of_streams),hAligned_on_host_b+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyHostToDevice,streams[i]);
cudaMemcpyAsync(device_c+i*(n/no_of_streams),hAligned_on_host_c+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyHostToDevice,streams[i]);
matrixAddition<<<blocks,threads,0,streams[i]>>>(device_a+i*(n/no_of_streams),device_b+i*(n/no_of_streams),device_c+i*(n/no_of_streams));
cudaMemcpyAsync(hAligned_on_host_a+i*(n/no_of_streams),device_a+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyDeviceToHost,streams[i]);
cudaMemcpyAsync(hAligned_on_host_b+i*(n/no_of_streamss),device_b+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyDeviceToHost,streams[i]);
cudaMemcpyAsync(hAligned_on_host_c+i*(n/no_of_streams),device_c+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyDeviceToHost,streams[i]));
}
答案 0 :(得分:1)
所以,你没有说明在cudaMalloc或cudaHostAlloc函数调用之后是否会发生这种情况。
固定内存是一种有限的资源。定义为固定存储器的任何存储器必须始终位于RAM中。因此,这为其他系统应用程序留下了较少的RAM空间。这意味着,如果你有4GB的RAM,你就不能有4GB的固定内存,否则就没有别的东西可以运行了。
800MB可能是系统强加的限制。考虑到它是RAM的四分之一,它可能是一个合理的限制。它也非常接近全局内存的大小。卡上的故障不会转化为主机上的故障,因此如果它在抱怨而不必运行cudaGetLastError之类的东西,那么它可能是主机上的问题。
抱歉,我不知道增加固定内存限制的具体细节。