2016-01-12 199 views
1

我是cuda編程的初學者。我正在嘗試一個簡單的代碼,但它不工作,我不知道還有什麼要做。Cuda程序不能正常工作

我的代碼:

#include <mpi.h> 
#include <cuda.h> 
#include <stdio.h> 
#include <sys/wait.h> 
// Prototypes 
__global__ void helloWorld(char*); 
__device__ int getGlobalIdx_2D_2D(); 

// Host function 

int main(int argc, char** argv) 
{ 
    unsigned int i, N, gridX, gridY, blockX, blockY; 
    N = 4096000; 

    char *str = (char *) malloc(N*sizeof(char)); 
    for(i=0; i < N; i++) str[i]='c'; 

    MPI_Init (&argc, &argv); 

    char *d_str; 
    size_t size = (size_t) N*sizeof(char); 
    cudaMalloc((void**)&d_str, size); 
    cudaMemcpy(d_str, str, size, cudaMemcpyHostToDevice); 

    gridX = 100; 
    gridY = 10; 
    blockX = blockY = 64; 
    dim3 dimGrid(gridX, gridY); // 4096 chars per block 
    dim3 dimBlock(blockX, blockY); // one thread per character, 2D 
    printf("dimGrid(%d, %d)\t", gridX, gridY); 
    printf("dimBlock(%d, %d)\t", blockX, blockY); 
    helloWorld<<< dimGrid, dimBlock >>>(d_str); 

    cudaMemcpy(str, d_str, size, cudaMemcpyDeviceToHost); 
    cudaThreadSynchronize(); 

    MPI_Barrier (MPI_COMM_WORLD); 

    cudaFree(d_str); 

    printf("\nRes:\n"); 
    for(i = 0; i < N; i++) printf("\t[%u] %c\n", i, str[i]); 

    MPI_Finalize(); 

    free(str); 
    return 0.0; 
} 

// Device kernel 
__global__ void helloWorld(char* str) 
{ 
    // determine where in the thread grid we are 
    int pos = getGlobalIdx_2D_2D(); 
    if (pos % 2 == 0) str[pos] -= 2; 
    else str[pos] += 8; 
} 

__device__ int getGlobalIdx_2D_2D() 
{ 
    int blockId = blockIdx.x + blockIdx.y * gridDim.x; 
    int threadId = blockId * (blockDim.x * blockDim.y) + 
        (threadIdx.y * blockDim.x) + threadIdx.x; 
    return threadId; 
} 

我所需的輸出是:jajajajajajaja ... x4096000

我讀過,「%」的操作效率不高,但我不認爲這是問題那裏。

謝謝!

+0

啊,它輸出的是'ccccccc ...'x4096000,作爲初始化,所以char指針數組沒有被修改過。 –

+0

只是好奇,爲什麼4096000次? –

+2

請將您的程序當前(不正確)輸出置於問題文本中。 – Lav

回答

0

你正在執行絕對沒有CUDA error checking,這樣做真的很有益。一旦啓用它,你會發現塊尺寸64×64是無效的,因爲它在一個塊內產生4096個線程,這不是一個有效的配置。

+0

我在HelloWorld例子中使用了cudaThreadSynchronize,所以我沒有任何理由。我開始使用CUDA錯誤檢查,問題是每個塊的64x64線程不是一個有效的配置,如本主題中所述(http://stackoverflow.com/questions/16125389/invalid-configuration-argument-error-for-the-呼叫的-CUDA內核) –