Linux内核里能调用CUDA函数吗?

内核里能调用CUDA函数吗?

:slight_smile:

我在kernel里面调用cuda函数,是可以被computeprof统计的。
kernel外调用cuda函数,似乎能计算但不使用GPU,无法被computeprof统计。
我是在linux下用的cuda3.0,其它系统可能有异。

[ 本帖最后由 kanshengzhe 于 2011-3-17 17:04 编辑 ]

[

首先说没有使用过linux.
我觉得不可能。在linux内核中调用cuda的用户态动态库, 这应该不可能的。就像是普通的libc.so无法被linux内核直接使用一样(它使用了特别编译的一个).

kanshengzhe麻烦发下你的实现。

[ 本帖最后由 悠闲的小猫 于 2011-3-17 19:51 编辑 ]

#include “math_functions.h”
#include “device_functions.h”
#include <stdio.h>
global void VecAdd(double* a, double* SIN, double* COS)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
sincos(a[i], SIN + i, COS + i);
}

int main()
{
int NUM = 5;
size_t SIZE = sizeof(double) * NUM;
double* ah = (double*)malloc(SIZE);
ah[0] = 0;
ah[1] = 90;
ah[2] = 3.1415926;
ah[3] = 1.247155;
ah[4] = 3.109967;
double* ad;
cudaMalloc((void**)&ad, SIZE);
cudaMemcpy(ad, ah, SIZE, cudaMemcpyHostToDevice);
double* sinh = (double*)malloc(SIZE);
double* sind;
cudaMalloc((void**)&sind, SIZE);
double* cosh = (double*)malloc(SIZE);
double* cosd;
cudaMalloc((void**)&cosd, SIZE);
int maxthreadperblock = 512;
int blochpergird = (NUM - 1) / maxthreadperblock + 1;
VecAdd<<<blochpergird, maxthreadperblock>>>(ad, sind, cosd);
cudaMemcpy(sinh, sind, SIZE, cudaMemcpyDeviceToHost);
cudaMemcpy(cosh, cosd, SIZE, cudaMemcpyDeviceToHost);
for(int i = 0; i < NUM; i++)
{
printf(“a=%f sin=%f cos=%f”,ah[i],sinh[i],cosh[i]);
}
cudaFree(ad);
cudaFree(sind);
cudaFree(cosd);
free(ah);
free(sinh);
free(cosh);
}

很简单的一个调用三角函数的实现,自己测吧。顺便可以查查文献看看到底怎么回事,我也有兴趣了解下。

随便说说,不做考证:cuda函数如果是段cpu代码,它永远别想在gpu上执行;如果是段gpu代码,那要看kernel能不能链接到这段代码。

[ 本帖最后由 kanshengzhe 于 2011-3-18 11:14 编辑 ]

kernerl前加__host__可被CPU调用

[

关于"linux内核"这个名词,我想,一般都是理解成linux内核吧,这应该没有什么歧义吧。
所以说楼主大人应该问的是linux内核里可否调用cuda…不是问在linux系统下的GPU的内核函数。。。。:slight_smile:

[ 本帖最后由 悠闲的小猫 于 2011-3-18 19:10 编辑 ]

说的对,我现在也在研究linux内核中能否调用cuda程序,可是上网找不到答案