kernel函数没有执行,不知道问题出在哪

u010699839 2014-06-09 09:48:03
小弟是初学者,刚刚上手写了一个程序,结果能编译通过但是执行的时候kernel函数根本没有执行,我的系统环境是fedora 19, cuda toolbox 6.0, IDE 是nsight eclipse,可以运行nvidia的范例程序。 后来我就写了一段简单代码看看是不是kernel调用的时候出了问题,我的代码如下:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<math.h>
#include<cuda.h>
#include<cuda_runtime.h>
#include"cu_complex_operation.cuh"
#include"chol_common.h"

__global__ void chol_kernel(
double *d_U,
const int n,
const int k )
{
const uint td=blockDim.x*blockIdx.x+threadIdx.x;


*d_U=11111;


}











void chol(
int n,
double *pR)
{

cudaError_t error;



double *d_x
double *y=(double*)malloc(sizeof(double));
double *m=(double*)malloc(sizeof(double));
error=cudaMalloc((void **) &d_x, sizeof(double));
if(error !=cudaSuccess){
printf("cudaMalloc d_U returned error code %d, line(%d)\n", error, __LINE__);
}
error=cudaMemcpy(d_x, y, sizeof(double), cudaMemcpyHostToDevice );
if(error!=cudaSuccess){
printf("cudaMemcpy U to d_U returned error code %d, line(%d)\n", error, __LINE__);
}

chol_kernel<<<1, 1>>>(d_x, n, n);
error=cudaMemcpy(m, d_x, sizeof(double), cudaMemcpyDeviceToHost );
*pR=*m;
free(y);
free(m);
cudaFree(d_x);
}

原本这个程序的kernel实现的是其他功能,现在为了简化问题我就用一个赋值的函数代替了。y是输入,m是输出,照理说m最后输出的应该是11111,但是实际上m输出之后还是0,kernel函数没有实现功能,小弟初次写cuda程序不知道是kernel写的有问题还是host端调用的时候出了问题,看了一些范例程序,也没看出来我这里的问题出在哪,困扰了好几天了。
...全文
1487 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
林微 2016-09-13
  • 打赏
  • 举报
回复
Maybe you could firstly check whether could these two functions (e.g. cudaSetDoubleForDevice() and cudaSetDoubleForHost()) be successfully called from Host or not? If you could, maybe your current CUDA version is too old to support double arithmetic which is widely supported for present CUDA devices. ~~Maybe you could also refer to CUDATOOKKIT. I hope it oculd be helpful for you,
_梦魇花葬 2014-06-11
  • 打赏
  • 举报
回复
引用 6 楼 u010699839 的回复:
[quote=引用 5 楼 sparrow986831 的回复:] 该问题应该是程序链接问题,建议重新配置CUDA环境~
问题解决了,是因为我这台老机子的GPU 的computation capability是1.1的,不支持double的精度。谢谢你的热心帮助。[/quote] 学习了~
u010699839 2014-06-11
  • 打赏
  • 举报
回复
引用 5 楼 sparrow986831 的回复:
该问题应该是程序链接问题,建议重新配置CUDA环境~
问题解决了,是因为我这台老机子的GPU 的computation capability是1.1的,不支持double的精度。谢谢你的热心帮助。
u010699839 2014-06-10
  • 打赏
  • 举报
回复
引用 2 楼 sparrow986831 的回复:
[quote=引用 1 楼 sparrow986831 的回复:]

// includes, system
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

// includes CUDA
#include <cuda_runtime.h>

// includes, project
#include <helper_cuda.h>
#include <helper_functions.h> // helper functions for SDK examples

////////////////////////////////////////////////////////////////////////////////
// declaration, forward

__global__ void kernel(double *d_U)
{
	*d_U = 11111;
}

void test(double *pR)
{
	double *d_x;
	double *y = (double*)malloc(sizeof(double));
	double *m = (double*)malloc(sizeof(double));

	cudaMalloc((void**)&d_x, sizeof(double));
	cudaMemcpy(d_x, y, sizeof(double), cudaMemcpyHostToDevice);
	kernel<<<1, 1>>>(d_x);
	cudaMemcpy(m, d_x, sizeof(double), cudaMemcpyDeviceToHost);
	*pR = *m;
}

int main()
{
	double *a = (double*)malloc(sizeof(double));
	test(a);
	printf("%f\n", *a);
	return 0;
}
上面是我在Ubuntu上的示例程序,只是将你程序中不用的变量删除了,变量a的结果是11111.000000,可以对照着你的程序进行修改。 调试的时候可以尝试着在kernel函数中使用“printf("%d", a);”来输出查看kernel的变量值(如果你的GPU计算能力在2.0以上)。[/quote] 谢谢斑竹,我用你的代码跑了一下,我的机器出来的结果依然是0,我在debug的时候,每当运行到kernel函数的时候,都会出现这个提示 : Can't find a source file at "/tmp/tmpxft_0000642d_00000000-3_test.cudafe1.stub.c" Locate the file or edit the source lookup path to include its location. 然后kernel函数就跳过不执行了,请问下这是什么原因呢?我运行NVIDIA的sample的时候,如果进入debug模式,也会出现这个提示,但是程序结果却是对的。
_梦魇花葬 2014-06-10
  • 打赏
  • 举报
回复
该问题应该是程序链接问题,建议重新配置CUDA环境~
u010699839 2014-06-10
  • 打赏
  • 举报
回复
会不会是工程设置的问题
_梦魇花葬 2014-06-09
  • 打赏
  • 举报
回复
引用 1 楼 sparrow986831 的回复:

// includes, system
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

// includes CUDA
#include <cuda_runtime.h>

// includes, project
#include <helper_cuda.h>
#include <helper_functions.h> // helper functions for SDK examples

////////////////////////////////////////////////////////////////////////////////
// declaration, forward

__global__ void kernel(double *d_U)
{
	*d_U = 11111;
}

void test(double *pR)
{
	double *d_x;
	double *y = (double*)malloc(sizeof(double));
	double *m = (double*)malloc(sizeof(double));

	cudaMalloc((void**)&d_x, sizeof(double));
	cudaMemcpy(d_x, y, sizeof(double), cudaMemcpyHostToDevice);
	kernel<<<1, 1>>>(d_x);
	cudaMemcpy(m, d_x, sizeof(double), cudaMemcpyDeviceToHost);
	*pR = *m;
}

int main()
{
	double *a = (double*)malloc(sizeof(double));
	test(a);
	printf("%f\n", *a);
	return 0;
}
上面是我在Ubuntu上的示例程序,只是将你程序中不用的变量删除了,变量a的结果是11111.000000,可以对照着你的程序进行修改。 调试的时候可以尝试着在kernel函数中使用“printf("%d", a);”来输出查看kernel的变量值(如果你的GPU计算能力在2.0以上)。
_梦魇花葬 2014-06-09
  • 打赏
  • 举报
回复

// includes, system
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

// includes CUDA
#include <cuda_runtime.h>

// includes, project
#include <helper_cuda.h>
#include <helper_functions.h> // helper functions for SDK examples

////////////////////////////////////////////////////////////////////////////////
// declaration, forward

__global__ void kernel(double *d_U)
{
	*d_U = 11111;
}

void test(double *pR)
{
	double *d_x;
	double *y = (double*)malloc(sizeof(double));
	double *m = (double*)malloc(sizeof(double));

	cudaMalloc((void**)&d_x, sizeof(double));
	cudaMemcpy(d_x, y, sizeof(double), cudaMemcpyHostToDevice);
	kernel<<<1, 1>>>(d_x);
	cudaMemcpy(m, d_x, sizeof(double), cudaMemcpyDeviceToHost);
	*pR = *m;
}

int main()
{
	double *a = (double*)malloc(sizeof(double));
	test(a);
	printf("%f\n", *a);
	return 0;
}

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧