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

[复制链接]
查看11 | 回复7 | 2010-10-8 09:32:26 | 显示全部楼层 |阅读模式
内核里能调用CUDA函数吗?
回复

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层



回复

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层
我在kernel里面调用cuda函数,是可以被computeprof统计的。
kernel外调用cuda函数,似乎能计算但不使用GPU,无法被computeprof统计。
我是在linux下用的cuda3.0,其它系统可能有异。
[ 本帖最后由 kanshengzhe 于 2011-3-17 17:04 编辑 ]
回复

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层
原帖由 cu888 于 2011-2-24 16:18 发表
内核里能调用CUDA函数吗?

原帖由 kanshengzhe 于 2011-3-17 17:02 发表
我在kernel里面调用cuda函数,是可以被computeprof统计的。
kernel外调用cuda函数,似乎能计算但不使用GPU,无法被computeprof统计。
我是在linux下用的cuda3.0,其它系统可能有异。


首先说没有使用过linux.
我觉得不可能。在linux内核中调用cuda的用户态动态库, 这应该不可能的。就像是普通的libc.so无法被linux内核直接使用一样(它使用了特别编译的一个).
kanshengzhe麻烦发下你的实现。
[ 本帖最后由 悠闲的小猫 于 2011-3-17 19:51 编辑 ]
回复

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层
#include "math_functions.h"
#include "device_functions.h"
#include
__global__ void VecAdd(double* a, double* SIN, double* COS)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
sincos(a, 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>(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,sinh,cosh);
}
cudaFree(ad);
cudaFree(sind);
cudaFree(cosd);
free(ah);
free(sinh);
free(cosh);
}
很简单的一个调用三角函数的实现,自己测吧。顺便可以查查文献看看到底怎么回事,我也有兴趣了解下。
随便说说,不做考证:cuda函数如果是段cpu代码,它永远别想在gpu上执行;如果是段gpu代码,那要看kernel能不能链接到这段代码。
[ 本帖最后由 kanshengzhe 于 2011-3-18 11:14 编辑 ]
回复

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层
kernerl前加__host__可被CPU调用
回复

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层
原帖由 kanshengzhe 于 2011-3-18 11:04 发表
#include "math_functions.h"
#include "device_functions.h"
#include
__global__ void VecAdd(double* a, double* SIN, double* COS)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
sincos(a, 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(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,sinh,cosh);
}
cudaFree(ad);
cudaFree(sind);
cudaFree(cosd);
free(ah);
free(sinh);
free(cosh);
}
很简单的一个调用三角函数的实现,自己测吧。顺便可以查查文献看看到底怎么回事,我也有兴趣了解下。
随便说说,不做考证:cuda函数如果是段cpu代码,它永远别想在gpu上执行;如果是段gpu代码,那要看kernel能不能链接到这段代码。


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


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

使用道具 举报

千问 | 2010-10-8 09:32:26 | 显示全部楼层
说的对,我现在也在研究linux内核中能否调用cuda程序,可是上网找不到答案
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行