Привязка текстурной памяти к выделенной матрице GPU - PullRequest
0 голосов
/ 31 июля 2011

Я создал матрицу с плавающей запятой на графическом процессоре размером (p7P_NXSTATES) x (p7P_NXTRANS) примерно так:

// Special Transitions
// Host pointer to array of device pointers
float **tmp_xsc = (float**)(malloc(p7P_NXSTATES * sizeof(float*)));
// For every alphabet in scoring profile...
for(i = 0; i < p7P_NXSTATES; i++)
{
    // Allocate memory for device for every alphabet letter in protein sequence
    cudaMalloc((void**)&(tmp_xsc[i]), p7P_NXTRANS * sizeof(float));
    // Copy over arrays
    cudaMemcpy(tmp_xsc[i], gm.xsc[i], p7P_NXTRANS * sizeof(float), cudaMemcpyHostToDevice);
}
// Copy device pointers to array of device pointers on GPU (matrix)
float **dev_xsc;
cudaMalloc((void***)&dev_xsc, p7P_NXSTATES * sizeof(float*));
cudaMemcpy(dev_xsc, tmp_xsc, p7P_NXSTATES * sizeof(float*), cudaMemcpyHostToDevice);

Эта память, однажды скопированная в графический процессор, никогда не изменяется и только для чтенияот.Таким образом, я решил связать это с текстурной памятью.Проблема в том, что при работе с 2D текстурной памятью связанная с ней память на самом деле является просто массивом, который использует смещения для работы в качестве матрицы.

Я знаю, что мне нужно использовать cudaBindTexture2D () и cudaCreateChannelDesc () связать эту 2D память для доступа к ней как таковой

tex2D (texXSC, x, y)

- но я просто не уверен, как.Есть идеи?

1 Ответ

1 голос
/ 31 июля 2011

Короткий ответ: вы не можете привязывать массивы указателей к текстурам. Вы можете либо создать массив CUDA и скопировать в него данные из линейной исходной памяти, либо использовать линейную тональную память, напрямую связанную с текстурой. Но массив указателей не будет работать.

...