Bạn có thể cudaMalloc bộ đệm có kích thước tối đa bạn có thể trên thiết bị của mình. Sau này, sao chép qua khối dữ liệu đầu vào của bạn có kích thước này từ máy chủ đến thiết bị, xử lý nó, sao chép lại kết quả và tiếp tục.
// Your input data on host
int hostBufNum = 5600000;
int* hostBuf = ...;
// Assume this is largest device buffer you can allocate
int devBufNum = 1000000;
int* devBuf;
cudaMalloc(&devBuf, sizeof(int) * devBufNum);
int* hostChunk = hostBuf;
int hostLeft = hostBufNum;
int chunkNum = (hostLeft < devBufNum) ? hostLeft : devBufNum;
do
{
cudaMemcpy(devBuf, hostChunk, chunkNum * sizeof(int) , cudaMemcpyHostToDevice);
doSomethingKernel<<< >>>(devBuf, chunkNum);
hostChunk = hostChunk + chunkNum;
hostLeft = hostBufNum - (hostChunk - hostBuf);
} while(hostLeft > 0);
Nguồn
2012-03-16 03:07:05
Phần đó tôi đã lên kế hoạch, nhưng kích thước dữ liệu đầu vào phải là bao nhiêu? – sj755
Kích thước của mảng lớn nhất bạn có thể phân bổ trên thiết bị. –
Bạn có thể cân nhắc sử dụng các bộ nhớ không đồng bộ của các phần hơi nhỏ hơn so với bộ nhớ (tối đa một nửa) và xử lý đoạn 'k' song song với việc chuyển chunk' k-1' trở lại máy chủ và chuyển đoạn 'k + 1' từ máy chủ lưu trữ thiết bị. Chồng chéo hai chiều yêu cầu một GPU Tesla, nhưng bạn có thể chồng chéo lên một hướng ngay cả trên GeForce. – harrism