0
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

const int threadsPerBlock = 256;
const int blocksPerGrid = 1024;
const int N = 64;

 __global__ void reverse(int *data, int count){

        __shared__ int cache[threadsPerBlock];
        int tid = threadIdx.x + blockIdx.x * blockDim.x;

        int cacheIndex = threadIdx.x;
        int tr = count-cacheIndex-1;
        if(tid< count/2)
        cache[cacheIndex] = data[cacheIndex];

        __syncthreads();
        data[cacheIndex] = cache[tr];
    }

int main(void){

    int a[N];
    int *devA;

    generate(a,N);

    cudaMalloc((void**)&devA, N * sizeof(int));


    cudaMemcpy(devA, a, N * sizeof(int), cudaMemcpyHostToDevice);

    reverse<<<blocksPerGrid,threadsPerBlock>>>(devA,N);

    cudaMemcpy(a,devA, N * sizeof(int), cudaMemcpyDeviceToHost);


    cout << a[63];

    cudaFree(devA);

}

上面的代码并没有颠倒我的相反。这个程序有什么问题?我怎么了?我认为一切都很好。我需要编辑什么才能正常工作?怎么了?

4

1 回答 1

2

您正在启动太多线程。对于您拥有的算法,所需的线程数是 N。但是您正在启动 1024*256 线程。

或者,也可能是良好的编码实践,是使用线程检查将代码包装在内核中,例如:

    int idx = threadIdx.x + blockDim.x*blockIdx.x;

    if (idx<count){
      // put your kernel code here
    }

此外,您的内核是这样编写的,它实际上只适用于适合单个线程块的数据大小。

如果您在这里查看@alrikai 提出的解决方案,可能会更好。该解决方案不需要任何同步或使用共享内存,因此它相当简单。

编辑回答下面的问题。

我犯了一个错误,因为我正在考虑alrikai的解决方案。我在上面编辑了我的代码。试试看。

于 2013-05-17T19:26:58.947 回答