Почему переменная моего устройства не копируется правильно с хоста?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему переменная моего устройства не копируется правильно с хоста?

Сообщение Anonymous »

Я работаю в CUDA со структурой XLOPER из набора надстроек Excel. У меня не было этой проблемы с двойниками, char * или структурой, которая представляет собой массив двойников, но XLOPER ведет себя по-другому. Хотя я пытаюсь передать ядру массив XLOPER, а не один. Простой пример проблемы можно увидеть с помощью этого кода:
Я пытаюсь установить здесь только xltype, а в процедуре глубокого копирования я пытаюсь установить для него значение 10, чтобы получить значение 0. в переменной поможет мне отличить значение от памяти, инициализированной значением 0.
Когда я отлаживаю в Nsight, у меня есть точка останова для просмотра элемента массива a1[2]. Хотя другие переменные, например idx, можно просмотреть, a1 (и варианты с * и индексами) и myx нельзя просмотреть ни в окне Quickwatch, ни в окне памяти.
Это также может быть переменная подсказка: когда я устанавливаю точку останова на myx = *a1[idx]; он достигает линии, но мне нужно нажать F10 примерно 10 раз, чтобы заставить его пройти эту линию (это одна из причин, по которой он находится внутри оператора if idx == 2, чтобы быть уверенным, что это не просто попадание в точку останова в других нити). Я новичок в CUDA, но мне это кажется странным.
Вот код:
#include
#include "device_launch_parameters.h"
#include

#include "windows.h"
#include "stdio.h"

/*
** XLREF structure
**
** Describes a single rectangular reference.
*/

typedef struct xlref
{
WORD rwFirst;
WORD rwLast;
BYTE colFirst;
BYTE colLast;
} XLREF, * LPXLREF;

/*
** XLMREF structure
**
** Describes multiple rectangular references.
** This is a variable size structure, default
** size is 1 reference.
*/

typedef struct xlmref
{
WORD count;
XLREF reftbl[1]; /* actually reftbl[count] */
} XLMREF, * LPXLMREF;

typedef struct xloper
{
union
{
double num; /* xltypeNum */
LPSTR str; /* xltypeStr */
WORD xbool; /* xltypeBool */
WORD err; /* xltypeErr */
short int w; /* xltypeInt */
struct
{
WORD count; /* always = 1 */
XLREF ref;
} sref; /* xltypeSRef */
struct
{
XLMREF* lpmref;
DWORD idSheet;
} mref; /* xltypeRef */
struct
{
struct xloper* lparray;
WORD rows;
WORD columns;
} array; /* xltypeMulti */
struct
{
union
{
short int level; /* xlflowRestart */
short int tbctrl; /* xlflowPause */
DWORD idSheet; /* xlflowGoto */
} valflow;
WORD rw; /* xlflowGoto */
BYTE col; /* xlflowGoto */
BYTE xlflow;
} flow; /* xltypeFlow */
struct
{
union
{
BYTE* lpbData; /* data passed to XL */
HANDLE hdata; /* data returned from XL */
} h;
long cbData;
} bigdata; /* xltypeBigData */
} val;
WORD xltype;
} XLOPER, * LPXLOPER;

#define xltypeNum 0x0001
#define xltypeStr 0x0002
#define xltypeBool 0x0004
#define xltypeRef 0x0008
#define xltypeErr 0x0010
#define xltypeFlow 0x0020
#define xltypeMulti 0x0040
#define xltypeMissing 0x0080
#define xltypeNil 0x0100
#define xltypeSRef 0x0400
#define xltypeInt 0x0800

void deepCopyXLOPER(XLOPER* dest, XLOPER* src) {
src->xltype = 10; // test to see if non-zero gets set in dest
cudaMemcpy(&(dest->xltype), &(src->xltype), sizeof(WORD), cudaMemcpyHostToDevice);
}

__global__ void test_kernel(XLOPER** a1, int numtotal) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < numtotal) {

XLOPER myx;

if (idx == 2)
myx = *a1[idx];

if (idx == 2)
int i = 100; // breakpoint to check myx
}
}

void test_kernel_wrapper(XLOPER** a1, int n1, int n2, int numtotal) {
int num_elements = n1 * n2;

test_kernel > (a1, numtotal);
cudaError_t err = cudaDeviceSynchronize();
if (err != cudaSuccess)
{
printf("Device synchronization failed : % s", cudaGetErrorString(err));
}
}

int main() {
;

int num_elements = 4;
XLOPER* a_h, * a_d;

a_h = nullptr;
a_d = nullptr;

// Allocate memory on the host
cudaError_t err = cudaMallocHost(&a_h, num_elements * sizeof(XLOPER));
if (err != cudaSuccess) {
std::cerr

Подробнее здесь: https://stackoverflow.com/questions/793 ... m-the-host
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»