微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CUDA在一个简单的程序中发出

如何解决CUDA在一个简单的程序中发出

| 我花了很多时间试图找出正在发生的事情?问题是我无法从主机代码调用此简单内核。我敢肯定某些人会立即发现该错误,但我觉得我很可能在浪费大量时间而没有理由。因此,我非常感谢您的帮助。 这是我的.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\",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];
}
所以我问我该怎么做才能调用内核?在编译时,它无法识别该符号\“ <<< \”,而reduce0()仅在我在.cpp中声明时才能识别它!请有人帮我最终从真正的CUDA开始!     

解决方法

CUfunction是驱动程序API抽象-如果要使用启用内核调用的<<< >>>语法的语言集成功能,则不需要。 如果您不必使用驱动程序API(大多数人都不需要),只需将C ++代码移至.cu文件并像现在一样调用内核即可。 “ 2”调用分配CPU无法读取或写入的设备内存。您必须使用
cudaMemcpy(...,cudaMemcpyHostToDevice);
将减少的输入复制到设备存储器中,然后在完成处理后使用
cudaMemcpy(...,cudaMemcpyDeviceToHost);
将输出复制到主机存储器中 ps还原内核非常慢。我建议您打开精简版SDK并从那里使用其中一个内核。 或者,使用将包含在CUDA 4.0中的Thrust库。推力支持非常快速和灵活的减少。     ,您调用内核的代码必须由NVCC编译器处理。 (<<<无效的C ++)通常意味着将其放在.cu文件中。您不想将所有cpp代码都移到cu中(如您在注释中所要求的),而只是将代码调用内核。 更改
CUfunction reduce0;
void reduce_kernel(int*g_idata,int*g_odata);
并替换这些行:
dim3 dimBlock(512,0);
dim3 dimGrid(1,1);

reduce0<<< dimGrid,dimBlock >>>(Md,Md);  
与:
reduce_kernel(Md,Md);
并将其添加到您的.cu文件中:
void reduce_kernel(int*g_idata,int*g_odata)
{
    dim3 dimBlock(512,0);
    dim3 dimGrid(1,1);

    reduce0<<< dimGrid,dimBlock >>>(g_idata,g_odata);  
}
这个问题不在我的脑海中,所以可能略有偏离,但是您可以理解。     ,您调用内核的代码必须由NVCC编译器处理。 (<<<无效的C ++)通常意味着将其放在.cu文件中。您不想将所有cpp代码都移到cu中(如您在注释中所要求的),而只是将代码调用内核。     ,除了上述内容,我想我在您的cudaMalloc调用中发现了一个错误。即使这不是一个实际错误,我也认为这是移植性更好的编程实践。相反,它应该是:
cudaMalloc((void**) &Md,sizeof(int)*N);
    ,如果您使用的是Windows计算机,请查看有关为CUDA 3.2设置Visual Studio 2010的文章: http://www.codeproject.com/Tips/186655/CUDA-3-2-on-VS2010-in-9-steps.aspx     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。