cublas中nrm2函数测试出错

先上图片:
[attach]3088[/attach]
这里面描述result可以是host或device属性。于是我尝试将计算结果存在device上,方便后续程序调用。
但是,我测试的时候发现,应用device变量的时候,程序能正常编译,但执行出错。
(host变量的话,正确运行)
程序代码如下:

#include<stdio.h>
#include<cuda_runtime.h>
#include<cublas_v2.h>

#define _DEVICE //choose host or device variable

int main(){

	float *A,*dA,num=0.0f,*dnum;
	int m=256*1024;
	cublasHandle_t handle;

	A=(float *)malloc(m*2*sizeof(float));
	cudaMalloc((void **)&dA,2*m*sizeof(float));
	cudaMalloc((void **)&dnum,sizeof(float));
	for(int i=0;i<2*m;i++)
		A[i]=0.123f*i;

	cudaMemcpy(dA,A,2*m*sizeof(float),cudaMemcpyHostToDevice);

	cublasCreate(&handle);
#ifdef _DEVICE
	cublasSnrm2(handle,2*m,dA,1,dnum);//use device variable dnum
	cudaMemcpy(&num,dnum,sizeof(float),cudaMemcpyDeviceToHost);//copy device variable to  host
#else
	cublasSnrm2(handle,2*m,dA,1,&num);//use host variable num		
#endif
	cublasDestroy(handle);
	cudaFree(dA);
	cudaFree(dnum);
	free(A);
	printf("float ::	%f\n",num);

	cudaDeviceReset();
	return 0;
}

不知道是cublas库中有bug还是我用法错误了?

加上这个就好了,cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_DEVICE);

今天加上测试了下,果然结果正确了~
以前没注意过这个函数,是自己太马虎。
非常感谢。

加在哪个位置???谢谢

上面代码22行和23行之间。

编译后出现这种情况,
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cublasDestroy_v2@4,该符号在函数 _main 中被引用
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cublasSnrm2_v2@20,该符号在函数 _main 中被引用
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cublasSetPointerMode_v2@8,该符号在函数 _main 中被引用
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cublasCreate_v2@4,该符号在函数 _main 中被引用
1>C:\Users\lyq\Documents\Visual Studio 2010\Projects\nrm2\Debug\nrm2.exe : fatal error LNK1120: 4 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:00.18
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
这是为什么?谢谢

你应该是没连接cublas库函数。请在编译行选项中加入 -L {cublas库所在的path} -lcublas
如果你要是用VS2008,请右键点击你的工程->属性->连接器->附加依赖关系,在里面加上cublas.lib

谢谢!成功!