Cuda程序不工作

Cuda程序不工作,cuda,mpi,Cuda,Mpi,我是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 funct

我是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;
}
#包括
#包括
#包括
#包括
//原型
__全局无效helloWorld(字符*);
__设备_uuuuint getGlobalIdx_2D_2D();
//宿主函数
int main(int argc,字符**argv)
{
无符号整数i,N,gridX,gridY,blockX,blockY;
N=4096000;
char*str=(char*)malloc(N*sizeof(char));
对于(i=0;i(迪乌街);
cudaMemcpy(str,d_str,size,cudaMemcpyDeviceToHost);
cudaThreadSynchronize();
MPI_屏障(MPI_通信世界);
库达弗里(迪乌街);
printf(“\nRes:\n”);
对于(i=0;i
我想要的输出是:jajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajaja。。。x4096000

我读到“%”操作效率不高,但我认为这不是问题所在


谢谢

你的表现绝对不是,这样做真的很有好处。启用它后,您会发现块尺寸64 x 64无效,因为它会在一个块中产生4096个线程,这不是一个有效的配置。

您执行的是绝对否,这样做非常有益。启用后,您会发现块尺寸64 x 64无效,因为它会导致一个块内4096个线程,这是无效的配置。

Ah,输出中打印的是'ccccccc…'x4096000,作为初始化,因此字符指针数组没有被修改。只是好奇,为什么是4096000次?请将您程序的当前(不正确)输出放入问题文本。我使用4096000只是为了大约4MB。输出:dimGrid(100,10)dimBlock(64,64)Res:[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]c[10]c[11]c[12]c[13]c[14]c[15] c[16]c[17]cAh,输出中打印的是'ccccccc…'x4096000,作为初始化,因此字符指针数组没有被修改。只是好奇,为什么4096000次?请将您程序的当前(不正确)输出放入问题文本。我使用4096000只是为了大约4MB。并使用cudaDeviceSynchronize()输出:dimGrid(100,10)dimBlock(64,64)Res:[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]c[10]c[11]c[12]c[13]c[14]c[15]c[17]cI在HelloWorld示例中使用了cudaThreadSynchronize,因此我没有任何理由。我开始使用CUDA错误检查,问题是每个块的64x64线程不是此线程()中解释的有效配置我在HelloWorld示例中使用了cudaThreadSynchronize,因此没有任何原因。我开始使用CUDA错误检查,问题是每个块的64x64个线程不是此线程()中解释的有效配置