0

GPUは私にとって新しいものです。この OpenCL スニペットは、7 ミリ秒で 7 MB を GPU に転送したことを示しています。それは正しいと思いますか、それとも何か不足していますか?

const int dim1Size = 960000;
int* dim1 = new int[dim1Size];
int* dim2 = new int[dim1Size];
long size = sizeof(int)*dim1Size*2;
size = size / 1024 / 1024;
cout << size << "mb to transfer" << endl;

cl_mem mem_d1 = clCreateBuffer(*context, 0, sizeof(int)*dim1Size, NULL, NULL);
cl_mem mem_d2 = clCreateBuffer(*context, 0, sizeof(int)*dim1Size, NULL, NULL);

GetSystemTime(&time);
WORD start = (time.wSecond * 1000) + time.wMilliseconds;
clEnqueueWriteBuffer(*queue, mem_d1, CL_TRUE, 0, sizeof(int)*dim1Size, dim1, 0, NULL, NULL);
clEnqueueWriteBuffer(*queue, mem_d2, CL_TRUE, 0, sizeof(int)*dim1Size, dim2, 0, NULL, NULL);
GetSystemTime(&time);
WORD end = (time.wSecond * 1000) + time.wMilliseconds;
cout << (end - start) << "ms to transfer";
4

1 に答える 1

1

OpenCL を実行できる GPU では、1MBps は非常に低速です。ただし、数値をもう少し詳しく見ると、少し異なる結果が得られる可能性があります。

まず、サンプルは 7MB をプッシュしていません。2 つのバッファをそれぞれ 3.66MB プッシュしています。合計すると 7.32MB で、大きな違いではありませんが、それでも違いはあります。

ただし、このコードには大きな不確実性があります。GetSystemTime() を使用しています。ミリ秒の精度で時間を報告しますが、粒度は保証されません。実際、より高い粒度を要求したプロセスがない場合、最大 55 ミリ秒の精度が得られます。これは、コードで起こっている可能性が最も高いです。現在の GetSystemTime() の粒度を把握できる簡単なサンプルを次に示します。

SYSTEMTIME t1, t2;
GetSystemTime(&t1);
do {
    GetSystemTime(&t2);
} while (0 == memcmp(&t1, &t2, sizeof(SYSTEMTIME)));
std::cout << "timer granularity is " << t2.wMilliseconds - t1.wMilliseconds << " milliseconds" << std::endl;

元の質問に答えると、非常に遅い種類の古い PCIe v.1.0 カードであっても、少なくとも ~700MBps のシステム -> ビデオ メモリ転送が見られるはずです。

于 2013-08-16T00:19:24.427 に答える