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

martelel

我有一个C代码(io.c),它可以完美地编译和运行。我正在尝试从cuda文件(PCA.cu)调用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 
}

个人电脑

#include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
#include <math.h>
#include <sys/time.h>


/*C includes*/

extern "C"{


#include "io.h"

}


#include "cuda.h"

/* Main */
int main(int argc, char** argv){

    int num_lines, num_samples, num_bands, lines_samples, data_type;
    Read_header(argv[1], &num_lines, &num_samples, &num_bands, &lines_samples, &data_type);
    printf("lines = %d\nsamples = %d\nbands = %d\npixels = %d\ndata_type = %d\n", num_lines, num_samples, num_bands, lines_samples, data_type);
        // the rest of source code has been removed for simplicity
} 

我正在使用以下Makefile来编译和链接io.c和PCA.cu:

MKL =1

CUDA_PATH=/usr/local/cuda-6.0
BUILD_DIR=./build

CUDA_INCLUDE_DIR=-I. -I$(CUDA_PATH)/include
CUDA_LIB_DIR=-L$(CUDA_PATH)/lib64

CUDALIBS=-lcublas -lcudart
utilS= -lpthread -lm

CFLAGS= -Wwrite-strings

CUDAFLAGS= --gpu-architecture sm_20

io.o : io.c
icc $(CFLAGS) -c -O3 io.c -o $(BUILD_DIR)/io.o

PCA.o: PCA.cu
nvcc $(CUDAFLAGS) $(CUDA_INCLUDE_DIR) -c -O3 PCA.cu -o $(BUILD_DIR)/PCA.o

#everything is already compiled, this is just a call to the linker
PCA: io.o PCA.o
icc $(CFLAGS) $(BUILD_DIR)/io.o $(BUILD_DIR)/PCA.o $(CUDA_LIB_DIR) $(utilS) $(CUDALIBS) -o PCA

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

有什么帮助吗?

罗伯特·克罗维拉

运行生成的可执行文件(./PCA)时出现分段错误(内核已转储)

该程序希望在命令行上指定文件名。

如果您按照问题(./PCA)中的描述原样运行程序,则会出现段错误。

这与CUDA无关。段错误是由于此调用而引起的:

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){

如果第一个参数(filename_header位于argv[1]中的main)为null(因为您尚未在命令行上指定文件名),则对的调用strstr将出现段错误。

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

解决方法是在命令行(./PCA myfile上指定文件名,甚至更好地编写一些代码来检测用户何时未提供有效的文件名,并通过错误消息暂停程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章