Я потратил так много времени, пытаясь выяснить, что происходит?Проблема в том, что я не могу вызвать это простое ядро из моего кода хоста.Я уверен, что ошибка будет заметна сразу же для некоторых людей, но я чувствую, что теряю много времени без причины, вероятно.Поэтому я очень признателен за любую помощь.
Это мой код .cpp
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <shrUtils.h>
#include <cutil_inline.h>
#include <cutil_gl_inline.h>
#include <cuda.h>
CUfunction reduce0; //i've used many ways to declare my kernel function,but.....
int main( int argc , char *argv[] ){
int i,N,sum;
int *data;
int *Md;
srand ( time(NULL) );
N=(int)pow((float)2,(float)atoi(argv[1]));
data=(int *)malloc(N * sizeof(int));
for (i=0;i<N;i++){
data[i]=rand() % 10 + 1;
}
cudaMalloc((void**) &Md, N );
clock_t start = clock();
dim3 dimBlock(512,0);
dim3 dimGrid(1,1);
reduce0<<< dimGrid,dimBlock >>>(Md,Md);
sum=0;
for(i=0;i<N;i++){
sum=sum+data[i];
}
printf("Sum of the %d-array is %d \n", N , sum);
printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);
return 0;
}
, а вот мой код .cu
__global__ void reduce0(int*g_idata, int*g_odata){
extern __shared__ int sdata[];
// each thread loadsone element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i= blockIdx.x*blockDim.x+ threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
// do reduction in shared mem
for(unsigned int s=1; s < blockDim.x; s *= 2) {
if(tid % (2*s) == 0){
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
// write result for this block to global mem
if(tid == 0) g_odata[blockIdx.x] = sdata[0];
}
Поэтому я спрашиваю, чтоя должен сделать, чтобы вызвать ядро?При компиляции он не распознает этот символ «<<<», а насколько за редуктор (0) он распознает его, только если я объявлю в .cpp!Пожалуйста, кто-нибудь, помогите мне наконец начать с настоящих вещей! </p>