cudaMallocではvoid**にキャストしないとダメ?

目次

CUDA Advent Calendar 2019 10日目の記事です.

cudaMalloc

cudaMallocやcudaMallocManagedをよく書くと思うのですが,お約束ごとのように

cudaMalloc(reinterpret_cast<void**>(&dev_a), sizeof(hoge) * N);
みたいに書いていませんか?
なぜvoid**にキャストしているかと言うとcudaMallocの第一引数の型がvoid**だからだと思うのですが,確かめましたか?
確かに本来第一引数はvoid**なのですが,実はcuda_runtime.hには みたいなものがあり,nvccを用いてコンパイルする場合はcuda_runtime.hが自動でincludeされるため
cudaMalloc(&dev_a, sizeof(hoge) * N);
のようにvoid**へのキャストが外せます.(バックエンドのコンパイラがC++に対応していればの話ですが)
clangではこのheaderファイルを使っていないためかエラーとなるようです.
他にもtemplateを使ってvoid**へのキャストを実は行わなくていい関数がたくさんあります.
カテゴリー:CUDA
記事作成日:2019-12-10