質問:実際のハードウェアがなくてもCUDAをプログラムおよびテストできるGeforceカード用のエミュレーターはありますか?
情報:
私はCUDAで私のいくつかのシミュレーションをスピードアップしたいと考えていますが、私の問題は、この開発を行うために常にデスクトップの周りにいるわけではないということです。代わりにネットブックでいくつかの作業を行いたいのですが、ネットブックにはGPUがありません。私の知る限り、CUDAを実行するにはCUDA対応GPUが必要です。これを回避する方法はありますか?唯一の方法はGPUエミュレーターであるように思われます(これは明らかに痛みを伴いますが、動作します)。しかし、これを行う方法が何であれ、私は聞きたいと思います。
Ubuntu 10.04 LTSでプログラミングしています。
gpuocelot
を使用できる場合があります。BunsenLabs(Linux 3.16.0-4-686-pae#1 SMP Debian 3.16.7-ckt20-1 + deb8u4(2016-02-29)i686 GNU/Linux)のエミュレータを入手しようとしました。
私が学んだことをお話しします。
nvcc
はCUDA Toolkit 3.0で-deviceemu
オプションを使用していたCUDA Toolkit 3.0をダウンロードしてインストールし、簡単なプログラムを実行しようとしました。
#include <stdio.h>
__global__ void helloWorld() {
printf("Hello world! I am %d (Warp %d) from %d.\n",
threadIdx.x, threadIdx.x / warpSize, blockIdx.x);
}
int main() {
int blocks, threads;
scanf("%d%d", &blocks, &threads);
helloWorld<<<blocks, threads>>>();
cudaDeviceSynchronize();
return 0;
}
CUDA Toolkit 3.0では、nvcc
は/usr/local/cuda/bin/
にありました。
私はそれをコンパイルするのが難しいことがわかりました:
NOTE: device emulation mode is deprecated in this release and will be removed in a future release. /usr/include/i386-linux-gnu/bits/byteswap.h(47): error: identifier "__builtin_bswap32" is undefined /usr/include/i386-linux-gnu/bits/byteswap.h(111): error: identifier "__builtin_bswap64" is undefined /home/user/Downloads/helloworld.cu(12): error: identifier "cudaDeviceSynchronize" is undefined 3 errors detected in the compilation of "/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii".
インターネットでgcc-4.2
の代わりにgcc-4.9.2
または同様に古いものを使用すると、エラーが消えることがあります。私はあきらめた。
gpuocelot
Stringerによる答えには、非常に古いgpuocelot
プロジェクトWebサイトへのリンクがあります。だから、最初は2012年かそこらでプロジェクトが放棄されたと思った。実際、それは数年後に放棄されました。
最新のWebサイトは次のとおりです。
ガイド に従ってgpuocelotをインストールしようとしました。しかし、インストール中にいくつかのエラーが発生したため、再度あきらめました。 gpuocelot
はサポートされなくなり、ライブラリとソフトウェアの非常に具体的なバージョンのセットに依存します。
2015年7月から このチュートリアル に従うことを試みるかもしれませんが、動作することを保証しません。私はそれをテストしていません。
MCUDA変換フレームワークは、CUDAプログラミングモデルをCPUアーキテクチャに効果的にコンパイルするように設計されたLinuxベースのツールです。
役に立つかもしれません。 ウェブサイトへのリンク です。
これは、Windows 7および8で使用するエミュレーターです。しかし、試したことはありません。もう開発されていないようです(最後のコミットの日付は2013年7月4日です)。
プロジェクトのウェブサイトへのリンクは次のとおりです。 https://code.google.com/archive/p/cuda-waste/
この応答は遅すぎるかもしれませんが、とにかく注意する価値があります。 GPU Ocelot (そのうち私はコア貢献者の一人です)はCUDAデバイスドライバーなしでコンパイルできます(libcuda.so)エミュレーターまたはLLVMバックエンドを使用する場合にインストールされます。 NVIDIA GPUのないシステムでエミュレーターのデモを行いました。
エミュレータは、古いGPUがサポートしていない機能を含むPTX 1.4およびPTX 2.1仕様を忠実に実装しようとします。 LLVMトランスレーターは、CUDAをマルチコアCPUおよびGPUの効果的なプログラミング方法にするために、PTXからx86への正確かつ効率的な変換に努めています。 -deviceemu
はかなり以前からCUDAの非推奨機能でしたが、LLVMトランスレーターは常に高速です。
さらに、いくつかの正当性チェッカーがエミュレータに組み込まれています。アライメントされたメモリアクセス、共有メモリへのアクセスが適切に同期され、グローバルメモリがメモリの割り当てられた領域に逆参照します。 コマンドラインインタラクティブデバッガー を実装しました。主にgdbに触発されて、CUDAカーネルをシングルステップし、ブレークポイントとウォッチポイントを設定します。これらのツールは、CUDAプログラムのデバッグを促進するために特別に開発されました;あなたはそれらを役に立つと思うかもしれません。
Linuxのみの側面については申し訳ありません。 Windowsブランチ(およびMac OS Xポート)を開始しましたが、エンジニアリングの負担はすでに調査の目的を強調するのに十分な大きさです。時間と興味がある人は、Windowsのサポートを提供してください。
お役に立てれば。
gpuocelot プロジェクトも確認できます。これは、PTX(CUDAコードが変換されるバイトコード)がエミュレートされるという意味で真のエミュレーターです。
LLVMトランスレータもあります。-deviceemuを使用する場合よりも高速かどうかをテストすることは興味深いでしょう。
CUDAツールキットhad CUDA 3.0リリースサイクルまで組み込まれたもの。これらの非常に古いバージョンのCUDAのいずれかを使用していますが、nvccでコンパイルする場合は-deviceemuを使用してください。
https://github.com/hughperkins/cuda-on-cl を使用すると、OpenCL 1.2 GPUでNVIDIA®CUDA™プログラムを実行できます(完全開示:私は著者です)
-deviceemuを使用してプログラミングするときは、エミュレーションモードでnvccが受け入れる操作がありますが、GPUで実際に実行しているときはできないため、注意してください。これは主にデバイスとホストの相互作用で見られます。
そして、あなたが述べたように、いくつかの遅い実行に備えてください。
GPGPU-Sim は、GPUを使用せずにCUDAプログラムを実行できるGPUシミュレーターです。役に立つ場合に備えて、GPGPU-Simを自分用にインストールして docker image を作成しました。