カーネル機能の実行後、印刷出力は常に0になります。 いくつかのテストの後、cudaMemcpyはまだ正しいです。しかし、カーネルは動作していないようですが、d_inputsから正しいデータを取得できません。 誰かが説明するのに役立つでしょうか?ありがとう!あなたはCUDAコードに問題があるCUDA出力は常に0
#include <cuda_runtime.h>
#include <cuda.h>
#include <stdio.h>
#include <sys/time.h>
#include <math.h>
#define N 32
__global__ void Kernel_double(int niters, int* d_inputs,double* d_outputs)
{
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if (tid<N) {
double val =(double) d_inputs[tid];
/*for (int iter=0; iter < niters; iter++){
val = (sqrt(pow(val,2.0)) + 5.0) - 101.0;
val = (val/3.0) + 102.0;
val = (val + 1.07) - 103.0;
val = (val/1.037) + 104.0;
val = (val + 3.00) - 105.0;
val = (val/0.22) + 106.0;
}*/
val = val + 1.0;
//printf("This is %f\n",val);
d_outputs[tid] = val;
}
}
int main(int argc, char **argv)
{
int niters = 10;
printf("Iterate %d times with GPU 0 or CPU 1: %d\n", niters, cpu);
int inputs[N];
for (int i = 0; i<N; i++){
inputs[i] = i+1;
}
int d_inputs[N];
double d_outputs[N];
double outputs[N];
cudaMalloc((void**)&d_inputs, N*sizeof(int));
cudaMalloc((void**)&d_outputs, N*sizeof(double));
printf("test %d \n", inputs[3]);
cudaMemcpy(d_inputs, inputs, N*sizeof(int), cudaMemcpyHostToDevice);
printf("test %d \n", d_inputs[1]);
Kernel_double<<<16,2>>>(niters, d_inputs,d_outputs);
//cudaDeviceSynchronize();
cudaMemcpy(outputs, d_outputs, N*sizeof(double), cudaMemcpyDeviceToHost);
for(int j =0;j<10; j++){
printf("Outputs[%d] is: %f and %f\n",j, d_outputs[j], outputs[j]);
}
cudaFree(d_inputs);
cudaFree(d_outputs);
return EXIT_SUCCESS;
}
あなたはあなたのコードをチェックイン全くエラーを持っていないので、それはどんな時に失敗することができあなたは知りません。エラーが発生するたびにエラーチェックを追加し、それが問題の絞り込みに役立つかどうかを確認します。 –
CHECK(cudaMalloc(void **)&d_inputs、N * sizeof(int))); \t CHECK(cudaGetLastError()); \tチェック(cudaMalloc((void **)&d_outputs、N * sizeof(double))); \t CHECK(cudaGetLastError()); \t printf( "test%d \ n"、inputs [3]); \t CHECK(cudaMemcpy(d_inputs、inputs、N * sizeof(int)、cudaMemcpyHostToDevice)); \t CHECK(cudaGetLastError()); \t printf( "テスト%d \ n"、d_inputs [1]); \t Kernel_double <<<16,2> >>(niters、d_inputs、d_outputs); \t CHECK(cudaGetLastError()); – user45690
これを追加した後、私はcudaMemcpyの行でエラーを受け取り、無効な引数を示します – user45690