2013-03-20 81 views
0

我正在尝试使用CUDA和C编写一个基本的矩阵乘法程序。代码本身并没有真正做任何事情,但至少应该编译。在对这个问题进行了一些研究之后,我确定这个问题没有包含CUDA头文件,说明我的Makefile存在问题。我对CUDA非常缺乏经验(和C有关),所以任何帮助将不胜感激。CUDA Makefile包含错误

输出的命令:make matrixMult1

c99 -I. -I/usr/local/cuda/include -c matrixMult1.c -o matrixMult1.o 
matrixMult1.c: In function 'main': 
matrixMult1.c:77: warning: implicit declaration of function 'cudaMalloc' 
matrixMult1.c:82: warning: implicit declaration of function 'cudaMemcpy' 
matrixMult1.c:83: error: 'cudaMemcpyHostToDevice' undeclared (first use in this 
function) 
matrixMult1.c:83: error: (Each undeclared identifier is reported only once 
matrixMult1.c:83: error: for each function it appears in.) 
matrixMult1.c:106: warning: implicit declaration of function 'cudaFree' 
make: *** [matrixMult1.o] Error 1 

的Makefile:

GCC = c99 
CUDA_INSTALL_PATH := /usr/local/cuda 
INCLUDES := -I. -I$(CUDA_INSTALL_PATH)/include 
CUDA_LIBS := -L$(CUDA_INSTALL_PATH)/lib -lcudart 

matrixMult1.o:   matrixMult1.c 
       $(GCC) $(INCLUDES) -c matrixMult1.c -o [email protected] 

matrixMult1:   matrixMult1.o 
       $(GCC) -o [email protected] matrixMult1.o $(CUDA_LIBS) 

C程序:

//******************************************************************** 
// matrixMult1.c 
// 
// A basic matrix multiplication program. 
//******************************************************************** 

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include "cuda.h" 

#define WA 3 
#define HA 3 
#define WB 3 
#define HB WA 
#define WC WB 
#define HC HA 

void initMatrix(float * matrix, int numIndices); 

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

    /* Set random seed */ 
    srand(2013); 

    /* Compute memory sizes for matrices A, B, and C */ 
    unsigned int sizeA = WA * HA; 
    unsigned int sizeB = WB * HB; 
    unsigned int sizeC = WC * HC; 
    unsigned int memoryA = sizeof(float) * sizeA; 
    unsigned int memoryB = sizeof(float) * sizeB; 
    unsigned int memoryC = sizeof(float) * sizeC; 

    /* Allocate memory for matrices A, B, and C */ 
    float * matrixA = (float *) malloc(memoryA); 
    float * matrixB = (float *) malloc(memoryB); 
    float * matrixC = (float *) malloc(memoryC); 

    /* Initialize matrices A and B */ 
    initMatrix(matrixA, sizeA); 
    initMatrix(matrixB, sizeB); 

    /* Print matrix A */ 
    printf("\nMatrix A:\n"); 
    for (int i = 0; i < sizeA; i++) { 
     printf("%f ", matrixA[i]); 

    if (((i + 1) % WA) == 0) { 
     printf("\n"); 
    } else { 
     printf(" | "); 
    } 
    } 

    /* Print matrix B */ 
    printf("\nMatrix B:\n"); 
    for (int i = 0; i < sizeB; i++) { 
    printf("%f ", matrixB[i]); 

    if (((i + 1) % WA) == 0) { 
     printf("\n"); 
    } else { 
     printf(" | "); 
    } 
    } 

    /* Allocate device memory */ 
    float* deviceMemA; 
    float* deviceMemB; 
    float* deviceMemC; 
    cudaMalloc((void**) &deviceMemA, memoryA); 
    cudaMalloc((void**) &deviceMemB, memoryB); 
    cudaMalloc((void**) &deviceMemC, memoryC); 

    /* Copy host memory to device */ 
    cudaMemcpy(deviceMemA, matrixA, memoryA, 
      cudaMemcpyHostToDevice); 
    cudaMemcpy(deviceMemB, matrixB, memoryB, 
       cudaMemcpyHostToDevice); 
    cudaMemcpy(deviceMemC, matrixC, memoryC, 
      cudaMemcpyHostToDevice); 

    /* Print matrix C */ 
    printf("\nMatrix C:\n"); 
    for (int i = 0; i < sizeC; i++) { 
    printf("%f ", matrixC[i]); 

    if (((i + 1) % WC) == 0) { 
     printf("\n"); 
    } else { 
     printf(" | "); 
    } 
    } 
    printf("\n"); 

    /* Free up memory */ 
    free(matrixA); 
    free(matrixB); 
    free(matrixC); 
    cudaFree(deviceMemA); 
    cudaFree(deviceMemB); 
    cudaFree(deviceMemC); 
} 

//-------------------------------------------------------------------- 
// initMatrix - Assigns a random float value to each indice of the 
//    matrix. 
// 
// PRE: matrix is a pointer to a block of bytes in memory; numIndices 
//  is the number of indicies in the matrix being instantiated. 
// POST: Each index of the matrix has been instantiated with a random 
//  float value. 
//-------------------------------------------------------------------- 
void initMatrix(float * matrix, int numIndices) { 

    /* 
    Loop through the block of bytes, assigning a random float 
    for each index of the matrix 
    */ 
    for (int i = 0; i < numIndices; ++i) { 

    /* Assign a random float between 0 and 1 at this byte */ 
    matrix[i] = rand()/(float)RAND_MAX; 
    } 
} 
+0

Makefile没有错,它是你的代码。您尚未将任何CUDA头文件包含到您的代码中。编译器抱怨未定义的常量是否真的令人惊讶? – talonmies 2013-03-20 09:19:14

+0

在您的代码中添加'#include '。 – 2013-03-20 09:21:27

+0

我试过cuda.h和cuda_runtime.h,都导致'没有这样的文件或目录'错误。我也检查过以确保这些文件位于/ usr/local/cuda/include /中。我在stackoverflow中编辑了代码,以反映我的更改和对错误输出的更改。 – 2013-03-20 09:27:26

回答

1

两个问题在这里:

  1. 你没有在你的代码中加入适当的头文件(你修正了这个头文件)
  2. 你的Makefile实际上已经坏了。它应该是这个样子:
GCC = c99 
CUDA_INSTALL_PATH := /usr/local/cuda 
INCLUDES := -I. -I$(CUDA_INSTALL_PATH)/include 
CUDA_LIBS := -L$(CUDA_INSTALL_PATH)/lib -lcudart 

matrixMult1.o:   matrixMult1.c 
       $(GCC) $(INCLUDES) -c matrixMult1.c -o [email protected] 

matrixMult1:   matrixMult1.o 
       $(GCC) -o [email protected] matrixMult1.o $(CUDA_LIBS) 

[免责声明:没有测试过,用在自己的风险]

目前的问题是,包括仅在构建的连锁相指定的路径。

请注意,这些更改也会抢占链接期间从未与CUDA运行时库链接期间会丢失的符号错误。请注意,根据您使用的是32位还是64位主机操作系统,您可能需要将库路径更改为$(CUDA_INSTALL_PATH)/lib64,以确保链接正常工作。

+0

我用这个Makefile修订版的结果更新了帖子。我不再收到'没有这样的文件或目录'错误,但它恢复到原来的错误状态。我正在运行32位Ubuntu 9.10。我不认为我得到一个缺少符号错误,有什么我失踪? – 2013-03-20 09:50:03

1

CUDA程序需要编译nvcc。虽然你的程序还没有包含任何CUDA内核,但我相信这就是你想要实现的。

重命名文件从matrixMult1.cmatrixMult1.cu,除去#include "cuda.h"线(与nvcc编译不需要任何CUDA的具体方案包括),并与nvcc代替gcc编译(通过在Makefile文件的开头设定GCC = nvcc EG) 。