Выход печати всегда равен 0 после выполнения функции ядра. После некоторого тестирования cudaMemcpy все еще верна. Но ядро кажется неработоспособным, не может получить правильные данные из d_inputs. Может ли кто-нибудь помочь объяснить? Благодаря!Выходы 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 CHECK (cudaMalloc ((void **) & d_outputs, N * sizeof (double))); \t CHECK (cudaGetLastError()); \t printf ("test% d \ n", входы [3]); \t CHECK (cudaMemcpy (d_inputs, input, N * sizeof (int), cudaMemcpyHostToDevice)); \t CHECK (cudaGetLastError()); \t printf ("test% d \ n", d_inputs [1]); \t Kernel_double <<<16,2> >> (niters, d_inputs, d_outputs); \t CHECK (cudaGetLastError()); – user45690
После этого, я получаю ошибку, в строке cudaMemcpy, говорит недействительный аргумент – user45690