我按照张舒赵开勇他们写的那本GPU高性能计算之cuda(貌似是这个名字),写的他第二章第一个和第二个example,运行结果都是这个错误,找不到exe,如图,求高手指点[attach]793[/attach]不知道各位看的清不,反正就是两个link2005,然后一个致命错误说是找到一个或多个多重定义的符号
楼主能把代码贴出来吗,这样信息太少
肯定是那里语句有错误,能帖出代码嘛
是不是说你在.cu文件中写的调用kernel的函数被重定义了
如果是这样的话可以在生成时讲.cu文件排除或者将其后缀改成.cuh
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<cutil.h>
#include"matrixassign_kernel.cu"
//函数声明
void runtest(int argc,char**argv);
//主函数
int main(int argc,char**argv)
{
runtest(argc,argv);
CUT_EXIT(argc,argv);//退出CUDA
}
void runtest(int argc,char** argv)
{
CUT_DEVICE_INIT(argc,argv);//启动CUDA
unsigned int num_blocks=4;
unsigned int num_threads=4;
unsigned int mem_size=sizeof(float)num_threadsnum_blocks;
//在host端分配显存,h_表示host端,i表示input,o表示output
float*h_idata=(float*)malloc(mem_size);
float*h_odata=(float*)malloc(mem_size);
//在device端分配显存,d_表示device端
float* d_idata;
CUDA_SAFE_CALL(cudaMalloc((void**)&d_idata,mem_size));
float* d_odata;
CUDA_SAFE_CALL(cudaMalloc((void**)&d_odata,mem_size));
//初始化内存中的值
for(unsigned int i=0;i<num_threads*num_blocks;i++)
h_idata[i]=1.0f;
//将内存中数据读入显存
CUDA_SAFE_CALL(cudaMemcpy(d_idata,h_idata,mem_size,cudaMemcpyHostToDevice));
//设置运行参数
dim3 grid(num_blocks,1,1);
dim3 threads(num_threads,1,1);
//运行内核函数,调用GPU运算
testkernel<<<grid,threads,mem_size>>>(d_idata,d_odata);
//检查GPU是否运行正常
CUT_CHECK_ERROR("Kernel execution failed");
//将结果从显存写入内存
CUDA_SAFE_CALL(cudaMemcpy(h_odata,d_odata,mem_size,cudaMemcpyDeviceToHost));
//打印结果
for(unsigned int i=0;i<num_blocks;i++)
{
for(unsigned int j=0;j<num_threads;j++)
{
printf("%5.0f",h_odata[i*num_threads+j]);
}
printf("\n");
}
//释放存储器
free(h_idata);
free(h_odata);
CUDA_SAFE_CALL(cudaFree(d_idata));
CUDA_SAFE_CALL(cudaFree(d_odata));
}
#ifndef EXAMPLE_1_KERNEL_H
#define EXAMPLE_1_KERNEL_H
global void testkernel(float* g_idata,float* g_odata)
{
extern shared float sdata;
const unsigned int bid=blockIdx.x;
const unsigned int tid_in_block=threadIdx.x;
const unsigned int tid_in_grid=blockDim.x*blockIdx.x+threadIdx.x;
//将数据从global读入share memory, 读入数据后进行一次同步,保证计算时所有数据均已到位
sdata[tid_in_block]=g_idata[tid_in_grid];
__syncthreads();
//计算,需要进行同步,确保要写入的数据已经被更新
sdata[tid_in_block]*=(float)bid;
__syncthreads();
//将shared memory中的数据写到global memory
g_odata[tid_in_grid]=sdata[tid_in_block];
}
#endif
上面就是我的代码,host和kernel的,之前的说的办法试了,木有效果滴说,不过依旧谢谢关注