現在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必要ない?
いやあるいはその他。
どなたか、理由が分かる方いましたらどうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。