質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

Q&A

解決済

2回答

1103閲覧

cudaで関数に渡す必要のある変数について質問です。

hanamur

総合スコア45

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

0グッド

0クリップ

投稿2022/06/02 19:52

現在visual studio 2022でCUDAを使ってプログラミングしています。

sample.cu

1#include <stdio.h> 2 3__global__ 4void saxpy(int n, float a, float *x, float *y) 5{ 6 int i = blockIdx.x*blockDim.x + threadIdx.x; 7 if (i < n) y[i] = a*x[i] + y[i]; 8} 9 10int main(void) 11{ 12 int N = 1<<20; 13 float *x, *y, *d_x, *d_y; 14 x = (float*)malloc(N*sizeof(float)); 15 y = (float*)malloc(N*sizeof(float)); 16 17 cudaMalloc(&d_x, N*sizeof(float)); 18 cudaMalloc(&d_y, N*sizeof(float)); 19 20 for (int i = 0; i < N; i++) { 21 x[i] = 1.0f; 22 y[i] = 2.0f; 23 } 24 25 cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice); 26 cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice); 27 28 // Perform SAXPY on 1M elements 29 saxpy<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y); 30 31 cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost); 32 33 float maxError = 0.0f; 34 for (int i = 0; i < N; i++) maxError = max(maxError, abs(y[i]-4.0f)); 35 printf("Max error: %f", maxError); 36}

これは
https://developer.nvidia.com/blog/easy-introduction-cuda-c-and-c/
このサイトからコピペしたサンプルプログラムです。
サンプル通りの結果になるのですが、一つ疑問が。
私の理解ですとCUDAではcudaMallocでホストメモリからデバイスメモリに変数を渡してそれらから計算するというものです。このサンプルではsaxpyに渡した変数のうちNはホストメモリにしか入っておらず、これをsaxpyの中で扱っていいものなのでしょうか。
・配列だけはcudaMallocしないといけない?(一変数だけのならOK?)
・コア数指定のところでも扱われてるからOK?
・cudaMallocのほうが効率がいいだけで実は遅くてもいいならcudaMalloc必要ない?
いやあるいはその他。
どなたか、理由が分かる方いましたらどうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Nはホストメモリにしか入っておらず、これをsaxpyの中で扱って

「saxpy」の最初の引数「int n」に格納されるのは「変数N」に格納されてる「数値」であって、「変数N」が「saxpy」内で使われるのではないと思いますけど

投稿2022/06/03 09:33

編集2022/06/07 22:36
jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C

1__global__ 2void saxpy(int n, float a, float *x, float *y) 3{ 4 int i = blockIdx.x*blockDim.x + threadIdx.x; 5 if (i < n) y[i] = a*x[i] + y[i]; 6}

saxpy() はGPUの中で動きますから、
ポインタ x,y の指す先(x[~], y[~])は GPU内になくてはなりません。
なので cudMalloc 使って領域をGPU内に確保します。

投稿2022/06/02 22:45

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanamur

2022/06/03 14:52

ありがとうございます。
jbpb0

2022/06/03 23:00 編集

epistemeさん 質問文には > このサンプルではsaxpyに渡した変数のうちNはホストメモリにしか入っておらず、これをsaxpyの中で扱っていいものなのでしょうか。 と書かれてるので、x, yじゃなくてNに付いての質問ですよ
episteme

2022/06/03 23:14

↑それについては自明かと。"値渡し"ですから。
jbpb0

2022/06/04 23:13

epistemeさん > それについては自明かと。 質問文で > このサンプルではsaxpyに渡した変数のうちNはホストメモリにしか入っておらず、これをsaxpyの中で扱っていいものなのでしょうか。 と聞いてるのだから、質問者さんには「自明では無い」のだと思います 質問者さんが > "値渡し"ですから。 を理解してるなら、 > 配列だけはcudaMallocしないといけない?(一変数だけのならOK?) とは書かないと思うのです 上記の「一変数だけの」は、Nに対応するもの(d_Nみたいな)なので、「なぜNにはcudaMalloc(とcudaMemcpy)は不要なのか?」と聞いてるわけですよね そのことから、質問者さんは「変数Nそのもの」がGPU側のコード内で扱われてると誤解してるように、私は感じました
episteme

2022/06/05 00:47

あー...確かに。 Nの”値"がコピーされてGPU内に飛び込んできてるわけで。 もし saxpy(int* N...) だったら N はGPU内になくてはならんので cudaMalloc で確保することに。
jbpb0

2022/06/07 23:08

epistemeさん 質問者さんの  「変数Nそのもの」がGPU側のコード内で扱われてる という誤解を解くために、 > Nの”値"がコピーされてGPU内に飛び込んできてる のであって、「変数Nそのもの」がGPU側のコード内で扱われてるのでは無い、ということも、回答に追記した方がいいと思います 私の最初のコメントに書いたように、この質問はNに付いての質問なので、Nに付いて触れるのが質問への直接の回答になるわけですし
hanamur

2022/06/09 00:00

すみません、 "値渡し"などのあれこれについて、お勉強したことはあったのですが 実際そこを意識せずとも問題が起こったことがなく(歴浅)、 お二人の回答から「ああ、なるほどあれか」と思い出した次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問