从cuda文件调用外部C文件中的函数

从cuda文件调用外部C文件中的函数,cuda,nvcc,icc,Cuda,Nvcc,Icc,我有一个C代码(io.C),它可以完美地编译和运行。我试图从cuda文件(PCA.cu)调用C代码(io.C)的函数: io.c #include <stdio.h> #include <stdlib.h> void Read_header(char filename_header[200], int *num_lines, int *num_samples, int *num_bands, int *lines_samples, int *data_type){

我有一个C代码(io.C),它可以完美地编译和运行。我试图从cuda文件(PCA.cu)调用C代码(io.C)的函数:

io.c

 #include <stdio.h>
#include <stdlib.h>
void Read_header(char filename_header[200], int *num_lines, int *num_samples, int *num_bands, int *lines_samples, int *data_type){

    FILE *fp;
    char line[200];
       char *ptr;
        int i=0;


    if(strstr(filename_header, ".hdr")==NULL){
        exit(1);
    }

    if ((fp=fopen(filename_header,"r"))==NULL){
        exit(1);
    }
    else{
        fseek(fp,0L,SEEK_SET);

        while(fgets(line, 200, fp)!='\0'){
            if(strstr(line, "samples")!=NULL){
                ptr=strrchr(line, ' ');
                ptr= ptr+1;
                *num_samples=atoi(ptr);
            }
            if(strstr(line, "lines")!=NULL){
                ptr=strrchr(line, ' ');
                ptr= ptr+1;
                *num_lines=atoi(ptr);
            }
            if(strstr(line, "bands")!=NULL){
                ptr=strrchr(line, ' ');
                ptr= ptr+1;
                *num_bands=atoi(ptr);
            }
            if(strstr(line, "data type")!=NULL){
                ptr=strrchr(line, ' ');
                ptr= ptr+1;
                *data_type=atoi(ptr);
            }


        }//while
        (*lines_samples)=(*num_lines)*(*num_samples);   

        fclose(fp);
    }//else 
}
当我运行生成的可执行文件(./PCA)时,我得到了分段错误(内核转储)

有什么帮助吗

当我运行生成的可执行文件(./PCA)时,我得到分段错误(内核转储)

此程序需要在命令行上指定文件名

如果您按照问题中所述的方式运行程序(
/PCA
),则会出现故障

这与CUDA无关。seg故障是由该调用引起的:

Read_header(argv[1], &num_lines, &num_samples, &num_bands, &lines_samples, &data_type);
argv[1]
希望提取一个命令行参数作为io.c中要使用的文件名,如下所示:

void Read_header(char filename_header[200], int *num_lines, int *num_samples, int *num_bands, int *lines_samples, int *data_type){
    ...  
    if(strstr(filename_header, ".hdr")==NULL){
如果
main
中的第一个参数(
filename\u header
,即
argv[1]
)为空(因为您没有在命令行上指定文件名),则对
strstr
的调用将seg fault

同样,这只是一个编码/使用错误,与CUDA无关


修复方法是在命令行上指定一个文件名(
/PCA myfile
),甚至更好地编写一些代码来检测用户何时没有提供有效的文件名,并用错误消息停止程序。

请发布其他人可以复制、粘贴的最小大小的代码,现在我猜想,这与调用CUDA代码时遇到的一个常见问题有关:NVCC将.Cu文件中的代码视为C++代码,因此所有函数名都被修饰。为了从.cu文件中的主机代码调用.c文件中定义的函数,必须声明该函数的可见原型
extern“c”
,以防止CUDA编译器修饰名称。
Read_header(argv[1], &num_lines, &num_samples, &num_bands, &lines_samples, &data_type);
void Read_header(char filename_header[200], int *num_lines, int *num_samples, int *num_bands, int *lines_samples, int *data_type){
    ...  
    if(strstr(filename_header, ".hdr")==NULL){