cuda的global函数里面可以调用__device__函数,在有特殊需要的时候,还可以把__device__函数作为参数传入到一个__global__函数中
在cuda里面不能像c++那样简单地传入函数的指针,需要在传入前对函数的指针做一些包装。
例如

typedef double(*funcFormat)(int,char);

这里面double表示函数的返回值,int,char是函数的参数列表,所有满足这种格式的函数都可以用这种函数类型指代。
上面的funcFormat是一种函数类型,在这里可以把它理解成一种数据类型,从此funcFormat代表的就是double(*)(int,char),后面声明__global__核函数的参数的时候,也直接使用furcFormat就行。
根据需要写好一个__device__函数之后,例如这样

__device__ double testFunc(int x,char y)
    //to do

这个函数testFunc仍然不能直接使用,需要用上面typedef出来的数据类型,把它声明成静态的函数指针

__device__ funcFormat staticTestFunc=testFunc;

,即使是这样,它仍然不能被直接使用,在传入函数指针的时候还需要把它转换成一个host函数指针,用cuda提供的cudaMemcpyFromSymbol接口来转换。

cudaMemcpyFromSymbol(&hostFunc,staticTestFunc,sizeof(funcFormat));

下面是一个具体的例子

#include<iostream>
//声明函数指针的类型
typedef double(*funcFormat)(int);
__device__ double testFunc(int x)
    return x*2+1;
//把函数指针声明成静态指针
__device__ funcFormat staticTestFunc=testFunc;
__global__ void cudaTest(double* gpuData,funcFormat func)
    gpuData[threadIdx.x]=(*func)(threadIdx.x);
int main()
    double* gpuData;
    cudaMalloc((void**)&gpuData,sizeof(double)*10);
    //新建一个位于host的同样的函数类型
    funcFormat hostFunc;
    //把之前指定过的静态指针复制到host部分
    cudaMemcpyFromSymbol(&hostFunc,staticTestFunc,sizeof(funcFormat));
    cudaTest<<<1,10>>>(gpuData,hostFunc);
    //把数据复制到cpu内存里面
    double cpuData[10];
    cudaMemcpy(cpuData,gpuData,sizeof(double)*10,cudaMemcpyDeviceToHost);
    for(int i=0;i<10;++i) std::cout<<cpuData[i]<<std::endl;
    return 0;
                                    https://stackoverflow.com/questions/12373940/difference-between-global-and-device-functions
__global__是kernel函数,可从cpu调用,调用时用<<< >>>语法配置并行化参数。__device__是只能从一个gpu函数调用,不能从cpu调用。
                                    改写SDK时候,看到SDK在.cu中用了全局变量,我也顺手写了个__device__的全局指针用于存储数据,并且用cudamalloc分配,结果死活kernel无法启动,发现应该是给全局指针的分配不成功。上网看了资料,发了帖子http://topic.csdn.net/u/20120406/11/96e76e5d-0923-444e-9b62-abaeac28e676.html,都没找到解决办法。
cudaMalloc():在显存上申请一块指定大小的动态内存。
cudaMemcpy():一般用作Host端内存数据和Device端显存数据互相传输拷贝。
cudaFree():释放显存中的动态内存。
这三个函数和标准C中的malloc()、memcpy()、free()的功能是类似的。
接下来我会首先简要分析3个API函数的用法,然后以一个具体的例子来说明三个函数是如何工作的。
CUDA APIAPI分析cudaMalloc()cudaMal
                                    CUDA编码对于函数部分前缀1.  __device__使用 _device_ 限定符声明的函数具有以下特征:n         在设备上执行;n         仅可通过设备调用。2. __global__使用 _global_ 限定符可将函数声明为内核。此类函数:n         在设备上执行;n         仅可通过主机调用。3. __host_
初始化为:
float value = 3.14f;
cudaMemcpyToSymbol(devData, &value, sizeof(float));在使用结束后,将其转回host:
cudaMemcpyFromSymbol(&value, de
                                            在《浅析GPU计算——CPU和GPU的选择》一文中,我们分析了在遇到什么瓶颈时需要考虑使用GPU去进行计算。本文将结合cuda编程来讲解实际应用例子。(转载请指明出于breaksoftware的csdn博客)
        之前我们讲解过,CPU是整个计算机的核心,它的主要工作是负责调度各种资源,包括其自身的计算资源以及GPU的计算计算资源。比如一个浮点数相乘逻辑,理论上我们可...
                                    CUDA编程,从某种意义而言,可以划分为异构系统编程,其实是一个CPU+GPU模式。其中,CPU被称为Host,而GPU被称为Device。
#include <cuda_runtime.h>
#include <stdio.h>
int main(int argc,char** argv)
    int deviceCount = 0;
    cudaError_t error_id = cudaGetDeviceCount(&deviceCount);
const double b = 2.34;
const double c = 3.57;
void __global__ add(const double *x, const double *y, doub
__constant__ float constData[256];
float data[256];
cudaMemcpyToSymbol(constData, data, sizeof(data));
cudaMemcpy
发现在__global__或__device__ 环境下可正常调用cudaMalloc分配gpu显存,并且可正常访问
__global__函数执行完成后,在新的global函数中,仍然可以访问在gpu环境下分配的显存
但是在执行cudaMemcpy函数对在__global__或__device__ 环境下分配的显存进行拷贝时,提示参数错误。(执行cudaMemcpy 拷贝到host环境下显存地址的指针值都是正确的。
与在__global__或__device__函数内部打印的值相