スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メモリオブジェクトの確保(続)

先のプログラムでは、確保するサイズを1GBにして、ホストメモリからメモリオブジェクトへ書き込みを行った時点で実行に失敗した。ということは、最初のメモリオブジェクトの生成自体は成功したということか。そこで、clCreateBuffer()で作成、clEnqueueWriteBuffer()で書き込み、としていた部分を、試しに、clCreateBuffer()のフラグにCL_MEM_COPY_HOST_PTRを指定して、作成と内容の転送を同時に行ってみる。
すなわち、

MYCLCREATE(mobj,
clCreateBuffer,
clm.context,
CL_MEM_READ_WRITE,
size * sizeof(char),
NULL);
clFlush(clm.queues[0]);
MYCLCHECK(clEnqueueWriteBuffer,
clm.queues[0],
mobj,
CL_TRUE,
0,
size * sizeof(char),
buf,
0, NULL, NULL);

の部分を、

MYCLCREATE(mobj,
clCreateBuffer,
clm.context,
CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR,
size * sizeof(char),
buf);

と変更してみる。この実行結果は、

(最初の部分略)
mobj allocation of 256 Mbytes succeeded.
mobj allocation of 512 Mbytes succeeded.
test8.cpp: 58 in main(): clEnqueueReadBuffer failed due to CL_MEM_OBJECT_ALLOCATION_FAILURE

となり、今度は少なくとも見かけ上は、作成(と同時に行われた書き込み)まで成功しているように見える。ううむそれでは、と、次は読み出しをやめて、作成だけにしてみた。


int main(int argc, char **argv)
{
myCLManager2 clm;
cl_mem mobj;
char *buf;
size_t size;
for(size = 256; size <= LONG_MAX; size<<=1 ){
buf = new char[size];
for(size_t i = 0; i < size; i++){
buf[i] = i % 100;
}
MYCLCREATE(mobj,
clCreateBuffer,
clm.context,
CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR,
size * sizeof(char),
buf);
clFlush(clm.queues[0]);
std::cout << "mobj allocation of " << sizeStr(size) << " succeeded.\n";
MYCLCHECK(clReleaseMemObject, mobj);
delete[] buf;
}
return 0;
}


これで実行してみると、
(最初の部分略)
mobj allocation of 256 Mbytes succeeded.
mobj allocation of 512 Mbytes succeeded.
mobj allocation of 1 Gbytes succeeded.
mobj allocation of 2 Gbytes succeeded.
^C
えええ・・・なんだか完全にGPUの物理的なメモリサイズを越えて作成できているではないか。1GBのあたりからホストメモリの方の確保のためにディスクスワップが発生して耐えがたくなってきたので、2GBの確保に成功した時点でControl+Cで中断した。

しかしここまでくると疑念が沸いてきたので、ホストメモリの確保と書き込みはやめて、最後に単にサイズ指定でのメモリオブジェクト生成だけを試してみることにする。


int main(int argc, char **argv)
{
myCLManager2 clm;
cl_mem mobj;
size_t size;
for(size = 256; size <= LONG_MAX; size<<=1 ){
MYCLCREATE(mobj,
clCreateBuffer,
clm.context,
CL_MEM_READ_WRITE,
size * sizeof(char),
NULL);
clFlush(clm.queues[0]);
std::cout << "mobj allocation of " << sizeStr(size) << " succeeded.\n";
MYCLCHECK(clReleaseMemObject, mobj);
}
return 0;
}


これを実行してみると・・・

mobj allocation of 256 Mbytes succeeded.
mobj allocation of 512 Mbytes succeeded.
mobj allocation of 1 Gbytes succeeded.
mobj allocation of 2 Gbytes succeeded.
mobj allocation of 4 Gbytes succeeded.
mobj allocation of 8 Gbytes succeeded.
mobj allocation of 16 Gbytes succeeded.
mobj allocation of 32 Gbytes succeeded.
mobj allocation of 64 Gbytes succeeded.
mobj allocation of 128 Gbytes succeeded.
mobj allocation of 256 Gbytes succeeded.
mobj allocation of 512 Gbytes succeeded.
mobj allocation of 1024 Gbytes succeeded.
mobj allocation of 2048 Gbytes succeeded.
mobj allocation of 4096 Gbytes succeeded.
mobj allocation of 8192 Gbytes succeeded.
mobj allocation of 16384 Gbytes succeeded.
mobj allocation of 32768 Gbytes succeeded.
mobj allocation of 65536 Gbytes succeeded.
mobj allocation of 131072 Gbytes succeeded.
mobj allocation of 262144 Gbytes succeeded.
mobj allocation of 524288 Gbytes succeeded.
mobj allocation of 1048576 Gbytes succeeded.
mobj allocation of 2097152 Gbytes succeeded.
mobj allocation of 4194304 Gbytes succeeded.
mobj allocation of 8388608 Gbytes succeeded.
mobj allocation of 16777216 Gbytes succeeded.
mobj allocation of 33554432 Gbytes succeeded.
mobj allocation of 67108864 Gbytes succeeded.
mobj allocation of 134217728 Gbytes succeeded.
mobj allocation of 268435456 Gbytes succeeded.
mobj allocation of 536870912 Gbytes succeeded.
mobj allocation of 1073741824 Gbytes succeeded.
mobj allocation of 2147483648 Gbytes succeeded.
mobj allocation of 4294967296 Gbytes succeeded.

もはや笑うしかない。
表示の単位をGBまでしか用意しなかったが、事実上天井知らずである。
とはいっても、明らかにこうして確保したメモリオブジェクトが実際に使用できるわけではない。結論としては、この(NVIDIA CUDA Toolkit 4.1 on Ubuntu)実行環境では、API上でのメモリオブジェクトの作成はあくまで「予約」扱いであり、実際のGPUメモリの確保や書き込みは、その結果が実行時に実際に必要になるまで遅延されているらしい、ということだ。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。