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);
}
以上代码不会反转我的反向。这个程序有什么问题?我怎么了?我觉得一切都还好。我需要编辑什么才能正常工作?有什么问题?
答案 0 :(得分:2)
你推出太多线程。对于你拥有的算法,所需的线程数是N.但是你要启动1024 * 256个线程。
或者,可能是良好的编码实践,将使用线程检查将代码包装在内核中,例如:
int idx = threadIdx.x + blockDim.x*blockIdx.x;
if (idx<count){
// put your kernel code here
}
此外,您的内核编写方式使其实际上仅适用于适合单个线程块的数据大小。
如果您只是查看@alrikai here提出的解决方案,可能会更好。该解决方案不需要任何同步或共享内存的使用,因此它更简单。
编辑回复以下问题。
我犯了一个错误,因为我正在考虑alrikai的解决方案。我编辑了上面的代码。试试吧。