Я работаю в 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
Почему переменная моего устройства не копируется правильно с хоста? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1736886916
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79355687/why-doesnt-my-device-variable-get-copied-correctly-from-the-host[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия