CUDA Array / Поверхностная память - PullRequest
3 голосов
/ 16 июня 2011

После вызова функции test я печатаю массив dtr1.Я ожидаю получить 100 для всех элементов, но я не получаю его.почему это?

#include "ImageUtil2D.h"
#define W 10
#define H 10
#define MAX 100000
#define No_THREADS 10
surface<void,2> surfD;

__global__ void test()
{
for(int i=0;i<W;i++)
    for(int j=0;j<H;j++)
    {
        float a=100;
        surf2Dwrite(a, surfD, i,j, cudaBoundaryModeTrap);
    }
}

int main()
{
int *image = new int[W*H];
float *dtr = new float[W*H];
ImageUtil2D::InitImg(image, dtr, W, H);
const size_t sizef = size_t(W*H)*sizeof(float);

cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray* cuArrD;
cudaMallocArray(&cuArrD, &channelDesc, W*H, 0, cudaArraySurfaceLoadStore);
//cudaMemcpyToArray(cuArrD, 0, 0, dtr, sizef, cudaMemcpyHostToDevice);
cudaBindSurfaceToArray(surfD, cuArrD);

test<<<1, 1>>>();

float *dtr1=new float[W*H];
cudaMemcpyFromArray(&dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost );
ImageUtil2D::Print(dtr1);
return 0;
}

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

Руководство по программированию CUDA C 3.2.Раздел: 3.2.4.2.2 Связывание поверхности

В отличие от памяти текстур, память поверхности использует байтовую адресацию.Это означает, что x-координата, используемая для доступа к элементу текстуры через функции текстуры, должна быть умножена на размер байта элемента, чтобы получить доступ к тому же элементу через функцию поверхности.

Попробуйте это:

surf2Dwrite(a, surfD, i * 4, j, cudaBoundaryModeTrap);

Надеюсь, что эта помощь.

Предложение: Прочитайте всю главу о Surface Memory, иначе у вас возникнут проблемы чтения / записи Coherency, прежде чем вы ее исключите;)

1 голос
/ 01 сентября 2015

Дополнительная проблема, указанная pQB в комментарии к собственному ответу на

cudaMemcpyFromArray(&dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost );

можно исправить, изменив вышеуказанную строку на

cudaMemcpyFromArray(dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...