все:Программирование общей памяти CUDA не работает
Я узнаю, как разделяемая память ускоряет процесс программирования графического процессора. Я использую коды ниже, чтобы вычислить квадрат значения каждого элемента плюс квадрат значения среднего его левого и правого соседей. Код работает, однако результат не так, как ожидалось.
Первые 10 результатов распечатываются 0,1,2,3,4,5,6,7,8,9, в то время как я ожидаю результат как 25,2,8, 18,32,50, 72,98,128,162;
Код выглядит следующим образом, со ссылкой на here;
Не могли бы вы рассказать мне, какая часть идет не так? Ваша помощь очень ценится.
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cuda.h>
const int N=1024;
__global__ void compute_it(float *data)
{
int tid = threadIdx.x;
__shared__ float myblock[N];
float tmp;
// load the thread's data element into shared memory
myblock[tid] = data[tid];
// ensure that all threads have loaded their values into
// shared memory; otherwise, one thread might be computing
// on unitialized data.
__syncthreads();
// compute the average of this thread's left and right neighbors
tmp = (myblock[tid>0?tid-1:(N-1)] + myblock[tid<(N-1)?tid+1:0]) * 0.5f;
// square the previousr result and add my value, squared
tmp = tmp*tmp + myblock[tid]*myblock[tid];
// write the result back to global memory
data[tid] = myblock[tid];
__syncthreads();
}
int main(){
char key;
float *a;
float *dev_a;
a = (float*)malloc(N*sizeof(float));
cudaMalloc((void**)&dev_a,N*sizeof(float));
for (int i=0; i<N; i++){
a [i] = i;
}
cudaMemcpy(dev_a, a, N*sizeof(float), cudaMemcpyHostToDevice);
compute_it<<<N,1>>>(dev_a);
cudaMemcpy(a, dev_a, N*sizeof(float), cudaMemcpyDeviceToHost);
for (int i=0; i<10; i++){
std::cout<<a [i]<<",";
}
std::cin>>key;
free (a);
free (dev_a);
Благодарим вас за подробный ответ, Роберт. Это помогает мне лучше понимать иерархию и изучать полезные поведения в программировании. Я исправил код, следующий за вашими предложениями и Кристофом. – user2718830