2012-03-16 32 views
6

Tôi đang làm việc trên một chương trình tăng tốc GPU đòi hỏi phải đọc toàn bộ tệp có kích thước biến. Câu hỏi của tôi, số byte tối ưu để đọc từ một tập tin và chuyển sang một bộ xử lý (thiết bị CUDA) là gì?Hiệu quả chuyển tệp lớn (tối đa 2GB) sang GPU CUDA?

Các tệp này có thể lớn tới 2GiB, do đó việc tạo bộ đệm có kích thước đó dường như không phải là ý tưởng hay nhất.

Trả lời

4

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);  
+0

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

+0

Kích thước của mảng lớn nhất bạn có thể phân bổ trên thiết bị. –

+5

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

0

Nếu bạn có thể chia chức năng của mình để bạn có thể làm việc trên các khối trên thẻ, bạn nên xem xét sử dụng luồng (cudaStream_t).

Nếu bạn lên lịch tải và thực thi hạt nhân trong một số luồng, bạn có thể có một luồng tải dữ liệu trong khi một thực thi hạt nhân trên thẻ, do đó ẩn một số thời gian chuyển dữ liệu của bạn trong thực thi hạt nhân.

Bạn cần khai báo bộ đệm có kích thước chunk của bạn bất cứ lúc nào tuy nhiên nhiều luồng bạn khai báo (tối đa 16, cho khả năng tính toán 1.x theo như tôi biết).