私はCUDAを初めて使用し、作成しようとしているものにかなりの問題があります。問題は次のとおりです。私は正方行列を持っています(今のところ5x5ですが、1k x 1kのようにもっと大きくなります)。この行列は乱数で満たされ、この行列をデバイスに渡します。動作します (今のところ、いくつかのしきい値のみが適用されます)。コードは次のとおりです。
#define N 3
#define MINTHRESHOLD 100
#define MAXTHRESHOLD 200
#define THREADS 128
__global__ void applyThresh(int *d_base, int *d_thresh) {
int tid = blockDim.x * blockIdx.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
while(tid < N) {
if(d_base[tid] > MAXTHRESHOLD) {
d_thresh[tid] = MAXTHRESHOLD;
} else if(d_base[tid] < MINTHRESHOLD) {
d_thresh[tid] = MINTHRESHOLD;
} else {
d_thresh[tid] = d_base[tid];
}
tid += stride;
}
}
int main( void ) {
cudaError_t err;
int *base, *thresh, *d_base, *d_thresh, i;
base = (int*)malloc((N * N) * sizeof(int));
thresh = (int*)malloc((N * N) * sizeof(int));
err = cudaMalloc((void**)&d_base, (N * N) * sizeof(int));
if(err != cudaSuccess) {printf("ERROR 1"); return -1;}
err = cudaMalloc((void**)&d_thresh, (N * N) * sizeof(int));
if(err != cudaSuccess) {printf("ERROR 2"); return -1;}
for(i = 0; i < N * N; i++) {
base[i] = rand() % 256;
thresh[i] = 0;
}
err = cudaMemcpy(d_base, base, (N * N) * sizeof(int), cudaMemcpyHostToDevice);
if(err != cudaSuccess){printf("ERROR 3"); return -1;}
applyThresh<<<(N + THREADS - 1)/THREADS , THREADS>>>(d_base, d_thresh);
err = cudaMemcpy(thresh, d_thresh, (N * N) * sizeof(int), cudaMemcpyDeviceToHost);
if(err != cudaSuccess) {printf("ERROR 4"); return -1;}
for(i = 0; i < N *N; i++) {
printf("%d -> ", base[i]);
printf("%d\n", thresh[i]);
}
free(base);
free(thresh);
cudaFree(d_base);
cudaFree(d_thresh);
return 0;
}
プログラムの出力は次のとおりです。
41 -> 100
35 -> 100
190 -> 190
132 -> 132
225 -> 200
108 -> -1082130432
214 -> -1082130432
174 -> 1007746492
82 -> 100509168
私は本当に問題を理解できません...マトリックスへのアクセスに使用しているインデックスが原因である可能性があると思いますが、解決策を見つけることができません:(